2015-11-09 3 views
0

У меня есть большой вложенный список, и в каждом вложенном списке есть два значения, название компании и количество, мне интересно, есть ли способ объединить вложенные списки, которые имеют с тем же именем, а затем добавить значения? так, например, здесь есть раздел спискаобъединяются как списки с вложенным списком

[['Acer', 481242.74], ['Beko', 966071.86], ['Cemex', 187242.16], ['Datsun', 748502.91], ['Equifax', 146517.59], ['Gerdau', 898579.89], ['Haribo', 265333.85], ['Gerdau', 13019.63676], ['Gerdau', 34107.12062], ['Acer', 52153.02848] 

я бы ожидать результата, который выглядит как один ниже

[['Acer',(481242.74+52153.02848)],['Beko', 966071.86],['Cemex', 187242.16],['Datsun', 748502.91],['Equifax', 146517.59],['Gerdau',(898579.89+13019.63676+34107.12062)],['Haribo', 265333.85]] 

так по существу им пытаются написать код, который будет идти через вложенный список и возвращает список сделанный, находя все списки с тем же [0] элемент и комбинируя там [1] элемент

+0

«так, по существу им пытаются писать код» ... Затем покажите, что вы попробовав пожалуйста. – Julien

ответ

4
from collections import defaultdict 
d = defaultdict(float) 
for name, amt in a: 
    d[name] += amt 

Что это делает, чтобы создать Dict, где сумма будет равна нулю (float()), а затем суммировать, используя имена в качестве ключей.

Если вам действительно нужен результат будет список, вы можете получить его таким образом:

>>> print d.items() 
[('Equifax', 146517.59), ('Haribo', 265333.85), ('Gerdau', 945706.64738), ('Cemex', 187242.16), ('Datsun', 748502.91), ('Beko', 966071.86), ('Acer', 533395.76848)] 
+0

как именно я применил это к моему коду? –

+0

Вы можете буквально скопировать его. –

0
from collections import defaultdict 
d = defaultdict(list) 
l=[['Acer', 481242.74], ['Beko', 966071.86], ['Cemex', 187242.16], ['Datsun', 748502.91], ['Equifax', 146517.59], ['Gerdau', 898579.89], ['Haribo', 265333.85], ['Gerdau', 13019.63676], ['Gerdau', 34107.12062], ['Acer', 52153.02848]] 
for k,v in l: 
    d[k].append(v) 
w=[] 
for x,y in d.items(): 
    w.append([x,sum(y)]) 
print w 

Prints-

[['Equifax', 146517.59], ['Haribo', 265333.85], ['Gerdau', 945706.64738], ['Cemex', 187242.16], ['Datsun', 748502.91], ['Beko', 966071.86], ['Acer', 533395.76848]] 

Если хотят, чтобы сделать его кортеж

map(tuple,w) 

Выход is-

[('Equifax', 146517.59), ('Haribo', 265333.85), ('Gerdau', 945706.64738), ('Cemex', 187242.16), ('Datsun', 748502.91), ('Beko', 966071.86), ('Acer', 533395.76848)] 
+0

Это не «добавляет» значения математически, а добавляет их в список. Я думаю, что OP, использующий '+' вместо ',' означает, что он/она хочет математику. –

0

defaultdict, вероятно, хороший путь, но вы можете сделать это с нормальным словарем:

>>> data = [['Acer', 481242.74], ['Beko', 966071.86], ['Cemex', 187242.16], ...] 
>>> result = {} 
>>> for k, v in data: 
...  result[k] = result.get(k, 0) + v 
>>> result 
{'Acer': 533395.76848, 'Beko': 966071.86, 'Cemex': 187242.16, ... } 
>>> list(result.items()) 
[('Acer', 533395.76848), ('Beko', 966071.86), ('Cemex', 187242.16), ...]