2016-11-18 3 views
1

У меня есть этот список списков:Sum различные элементы списка списков с помощью одного словаря (Python)

[Racing, 100] 
    [Crossi, 100] 
    [Racing, 120] 
    [Racing, 130] 
    [Marcas, 105] 
    [Marcas, 109] 
    [Crossi, 130] 
    [Crossi, 104] 

Я хочу общую сумму для гонок, Marcas и Crossi. Я хочу сделать это с помощью диктатора на python, если это возможно. Например:

Brads{"Crossi": 334, "Marcas": 214, "Racing":350} 

Возможно ли это сделать только с одним «для кучки»?

+0

Вы имеете в виду у вас есть список, как этот список = [[Гонки, 100] [Crossi, 100], [Гонки, 120], [Гонки, 130], [Marcas, 105], [Marcas, 109], [Crossi, 130], [Crossi, 104]] – Ayoub

+0

Да, я хочу, чтобы это было @Ayoub –

ответ

1
from collections import defaultdict 
list_ = [['Racing', 100],['Crossi', 100],['Racing', 120],['Racing', 130],['Marcas', 105],['Marcas', 109],['Crossi', 130],['Crossi', 104]] 
dic = defaultdict(int) 
for i in list_: 
    dic[i[0]] += i[1] 
print(dic) 

из:

defaultdict(<class 'int'>, {'Marcas': 214, 'Crossi': 334, 'Racing': 350}) 

SetDefault:

list_ = [['Racing', 100],['Crossi', 100],['Racing', 120],['Racing', 130],['Marcas', 105],['Marcas', 109],['Crossi', 130],['Crossi', 104]] 
d = {} 
for k,v in list_: 
    d[k] = d.setdefault(k,0) + v 
print(d) 

из:

{'Marcas': 214, 'Crossi': 334, 'Racing': 350} 
1

Вы можете использовать collections.defaultdict для этого

from collections import defaultdict 

l = [['Racing', 100], 
    ['Crossi', 100], 
    ['Racing', 120], 
    ['Racing', 130], 
    ['Marcas', 105], 
    ['Marcas', 109], 
    ['Crossi', 130], 
    ['Crossi', 104]] 

d = defaultdict(int) 
for key, value in l: 
    d[key] += value 

Вывод print(d)

defaultdict(<class 'int'>, {'Marcas': 214, 'Racing': 350, 'Crossi': 334}) 
1

Вы можете сделать это:

list_of_list = [ 
    ['Racing', 100], 
    ['Crossi', 100], 
    ['Racing', 120], 
    ['Racing', 130], 
    ['Marcas', 105], 
    ['Marcas', 109], 
    ['Crossi', 130], 
    ['Crossi', 104] 
] 

people = {} 

for selected_list in list_of_list: 
    name = selected_list[0] 
    if name in people: 
     people[name] += selected_list[1] 
    else: 
     people[name] = selected_list[1] 
0

Без импорта коллекции, вы можете получить такое же поведение с помощью dict.get() как:

my_dict = {} 
for k, v in l: 
    my_dict[k] = my_dict.get(k, 0) + v # Here `my_dict.get(k)` will return the value 
             # if `k` key is found, else will return 0 
# Final content of `my_dict`: 
# {'Racing': 350, 
# 'Marcas': 214, 
# 'Crossi': 334} 

, где l - это список, указанный в вопросе.

0

С большим количеством итераций в списке вы можете решить проблему однострочным способом.

l = [['Racing', 100], ['Crossi', 100], ['Racing', 120], ['Racing', 130], 
    ['Marcas', 105], ['Marcas', 109], ['Crossi', 130], ['Crossi', 104]] 

print dict((el[0], sum(v for k, v in l if k == el[0])) for el in l) 
+0

Я бы не сказал, что это больше pythonic. Это решение является «O (N^2)», тогда как все остальные решения, указанные выше, являются «O (NlogN)», – CoryKramer

Смежные вопросы