2012-02-15 2 views
2
huge = sum([x for key in G for (_,x) in G[key]]+1) 

Это то, что у меня есть до сих пор, хотя его возвращающая ошибка типа может содержать только список конкатенаций (а не «int»), которые я не понимаю.В Python, как суммировать список чисел в кортеже, в списке в словаре?

В основном Im дело с структурой данных что-то вроде

{1: [("A",2), ("B",3)]} 

и так далее, как это, так что каждый ключ в словаре имеет значение, которое представляет собой список кортежей, а второй элемент, индекс = 1 каждого кортежа - это значения, которые я хочу суммировать, поэтому в приведенном ниже примере:

huge = 5 # i.e. 2 + 3 

Любые советы?

+1

Рекомендуем вам добавить строку кода, которая предоставляет ввод. – YXD

+2

Выглядит хорошо, просто удалите '+ 1'. Альтернативно: 'sum (v [1] для l в G.itervalues ​​() для v в l)'. –

ответ

5
>>> G = {1:[("A",2),("B",3)]} 
>>> sum(y for v in G.itervalues() for (x, y) in v) 
5 

Ошибки происходит от выражения [x for key in G for (_,x) in G[key]] + 1 который пытается добавить список и номер. Это TypeError.

0

Мой Питона ржавый, но у вас есть по существу

huge = sum([...list...] + 1) 

Я думаю, что это жалуется, что вы добавляете 1 к списку. Возможно, вы имели в виду:

huge = sum([...list...]) + 1 
0
sum = 0 
for key, item in data.iteritems(): 
    for group in item: 
     sum += group[-1] 

Должно работать нормально.

НЕ все должно быть список пониманием

1

Я думаю, что вы ищете что-то вроде этого:

for itertools import chain 
sum([v for _, v in chain.from_iterable(G.values())]) 

или с ленивыми вычислениями:

sum(v for _, v in chain.from_iterable(G.itervalues())) 
0

Это может не является наиболее Pythonic, но он прямолинейный:

my_map = {1:[("A",1),("B",2)],2:[("C",3),("D",4)]} 

total = 0 

for k in my_map.keys(): 
    this_list = my_map[k] 
    for this_tuple in this_list: 
     total += this_tuple[1] 

print total 
+0

Несложные варианты имен переменных, ISTM. Это clobbers три встроенных: карта, список и кортеж. – DSM

+0

Хорошая точка. Я редактировал. Новые имена не велики, но будут служить примером, ИМО. –

0

Я думаю, что мы не имеем еще

sum(group[1] for value in data.itervalues() for group in value) 

.

0

Вы говорите, что вы только хотите подытожить кортежи в списке G [1]? Если да, то это то, что вы после:

huge = sum(x for _, x in G[1]) 

Примечание: Вам не нужно, чтобы построить новый список перед суммированием его; оставляя квадратные скобки, делает это за один проход.