2016-05-26 1 views
1

У меня есть csv с именем, ролью, многолетним опытом. Я хочу создать список кортежей, который объединяет (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

Можете ли вы дать EXA нужный результат? Я имею в виду, как вы хотите объединить столбцы? – Kasramvd

+0

Да! [('Кен', 'инженер', 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)) ...] .. так что позже я могу использовать это имя в качестве ключа dict, предполагающий, что имена уникальны или заменяют имена идентификаторами. – user6384905

+0

@ user6384905 Проверьте изменения. – Kasramvd

+0

Я думаю .append ((rol, total_exp_inthisRole)) требуется еще одна '()'. но да, это дает необходимую форму. благодаря! :) – user6384905