2016-05-26 27 views
1

我有一个名字,角色,多年经验的csv。我想为所有employess创建一个集合列表(name, role1, total_exp_inthisRole)。 到目前为止,我能够用defaultdict做以下有效使用python groupby或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解决多个键或更简单的方法吗?感谢所有提前。

+1

你可以给一个例子你想要的结果多少?我的意思是你想如何聚合这些列? – Kasramvd

+0

是的! ('Ken','engineer',5),('ken,'sr。engineer',6),...]或[('Ken',('engineer',5),''sr。工程师',6)),...] – user6384905

回答

1

你可以简单地通过名称和角色的元组到您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) 
+0

谢谢! ('Ken',('engineer',5),('sr。engineer',6)),...] ..以后我可以用这个名字作为关键字一个字典假设名称是唯一的或用ID替换名称。 – user6384905

+0

@ user6384905检查编辑。 – Kasramvd

+0

我认为.append((rol,total_exp_inthisRole))需要一个'()'。但是,它提供了所需的形式。谢谢! :) – user6384905