2013-07-25 16 views
7

Mam listę słowników. Każdy słownik ma liczbę całkowitą i wartość krotki. Chciałbym podsumować wszystkie elementy znajdujące się w określonej pozycji krotki.Python Lista słowników [int: tuple] Suma

Przykład:

myList = [{1000:("a",10)},{1001:("b",20)},{1003:("c",30)},{1000:("d",40)}] 

Wiem, że może zrobić coś takiego:

sum = 0 
for i in myList: 
    for i in myList: 
     temp = i.keys() 
     sum += i[temp[0]][1] 
print sum 

Czy istnieje bardziej pythonic sposób to zrobić? Dzięki

+2

Ogólna zasada: jeśli bezpośrednio za pomocą pętli for jest bardziej pythonic sposób robienia rzeczy. –

+5

@SlaterTyranus: Nie powiedziałbym tego, istnieje wiele pytonicznych zastosowań pętli 'for'. –

+1

@MartijnPieters Jestem pewien, że istnieją, ale mam wrażenie, że ponad 90% wszystkich pętli wieloliniowych to wskaźniki kodu, które muszą zostać refaktoryzowane. Aby wyjaśnić: bezpośrednio używając pętli for, rozumiem, że nie używam składni in-line. –

Odpowiedz

7

użycie wyrażenia Generator, zapętlenie nad wszystkimi słownikach następnie ich wartości:

sum(v[1] for d in myList for v in d.itervalues()) 

dla Pythona 3, zastąpić d.itervalues() z d.values().

Demo:

>>> sum(v[1] for d in myList for v in d.itervalues()) 
100 
0
import itertools 
sum((v[1][1] for v in itertools.chain(*[d.items() for d in myList]))) 

itertools can "łańcuch" razem kilka wykazów są logicznie jeden.

0

Nie wiem, czy jest to bardziej pythonic sposób:

print sum([i[i.keys()[0]][1] for i in myList])