有效地使用 python groupby 或 defaultdict?
Using python groupby or defaultdict effectively?
我有一份包含姓名、角色和多年经验的 csv。我想创建一个元组列表,为所有雇员聚合 (name, role1, total_exp_inthisRole)
。
到目前为止,我可以使用 defaultdict 来执行以下操作
import csv, urllib2
from collections import defaultdict
response = urllib2.urlopen(url)
cr = csv.reader(response)
parsed = ((row[0],row[1],int(row[2])) for row in cr)
employees =[]
for item in parsed:
employees.append(tuple(item))
employeeExp = defaultdict(int)
for x,y,z in employees: # variable unpacking
employeeExp[x] += z
employeeExp.items()
输出:[('Ken', 15), ('Buckky', 5), ('Tina', 10)]
但我如何使用第二列也能达到我想要的结果。我应该尝试通过 groupby
多个键或更简单的方法来解决吗?提前谢谢大家。
您可以简单地将名称和角色的元组传递给您的 defaultdict
,而不是只传递一个项目:
for x,y,z in employees:
employeeExp[(x, y)] += z
对于您的第二个预期输出 ([('Ken', ('engineer', 5),('sr. engineer', 6)), ...]
)
您需要再次聚合上述代码段的结果,但这次您需要使用 defaultdict
和列表:
d = defaultdict(list)
for (name, rol), total_exp_inthisRole in employeeExp.items():
d[name].append(rol, total_exp_inthisRole)
我有一份包含姓名、角色和多年经验的 csv。我想创建一个元组列表,为所有雇员聚合 (name, role1, total_exp_inthisRole)
。
到目前为止,我可以使用 defaultdict 来执行以下操作
import csv, urllib2
from collections import defaultdict
response = urllib2.urlopen(url)
cr = csv.reader(response)
parsed = ((row[0],row[1],int(row[2])) for row in cr)
employees =[]
for item in parsed:
employees.append(tuple(item))
employeeExp = defaultdict(int)
for x,y,z in employees: # variable unpacking
employeeExp[x] += z
employeeExp.items()
输出:[('Ken', 15), ('Buckky', 5), ('Tina', 10)]
但我如何使用第二列也能达到我想要的结果。我应该尝试通过 groupby
多个键或更简单的方法来解决吗?提前谢谢大家。
您可以简单地将名称和角色的元组传递给您的 defaultdict
,而不是只传递一个项目:
for x,y,z in employees:
employeeExp[(x, y)] += z
对于您的第二个预期输出 ([('Ken', ('engineer', 5),('sr. engineer', 6)), ...]
)
您需要再次聚合上述代码段的结果,但这次您需要使用 defaultdict
和列表:
d = defaultdict(list)
for (name, rol), total_exp_inthisRole in employeeExp.items():
d[name].append(rol, total_exp_inthisRole)