2016-05-26 30 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