2012-11-08 65 views
0

我有一個數據結構是這樣的值:迭代通過列表的+類型的字典加起來相同的密鑰

[ 
    { "key" : { "subkey" : "red", "value" : 1 } }, 
    { "key" : { "subkey" : "red", "value" : 2 } }, 
    { "key" : { "subkey" : "blue", "value" : 1 } }, 
    { "key" : { "subkey" : "yellow", "value" : 3 } }, 
    { "key" : { "subkey" : "blue", "value" : 5 } }, 
    { "key" : { "subkey" : "blue", "value" : 8 } }, 
    { "key" : { "subkey" : "red", "value" : 2 } }, 
    { "key" : { "subkey" : "red", "value" : 3 } }, 
    { "key" : { "subkey" : "red", "value" : 6 } }, 
] 

的想法是我想通過它來循環和當至少2 "subkeys"是相同的,發射some_event(),這會將這些連續對象的值相加,直到再次遇到不同的"subkey"

例如,第一個和第二個字符應該觸發some_event(),並添加值。然後第三個(藍色),第四個(黃色)線,第五個和第六個(藍色)火焰熄滅some_event(),其值爲5+8等等沒有任何反應。

謝謝!

+0

你只想要連續運行嗎?還是應該在第3和第5個字幕上觸發'some_event()'? –

+0

只有連續的字典 - 基本上是1和2,5和6以及7,8,9。 –

+1

我不明白1 + 2,3 + 4,5 + 6和7 + 8 + 9背後的邏輯。爲什麼最後一個組包含三個元素,而另一個包含兩個? – NPE

回答

1
from itertools import groupby 

L = [ 
    { "key" : { "subkey" : "red", "value" : 1 } }, 
    { "key" : { "subkey" : "red", "value" : 2 } }, 
    { "key" : { "subkey" : "blue", "value" : 1 } }, 
    { "key" : { "subkey" : "yellow", "value" : 3 } }, 
    { "key" : { "subkey" : "blue", "value" : 5 } }, 
    { "key" : { "subkey" : "blue", "value" : 8 } }, 
    { "key" : { "subkey" : "red", "value" : 2 } }, 
    { "key" : { "subkey" : "red", "value" : 3 } }, 
    { "key" : { "subkey" : "red", "value" : 6 } }, 
] 


def some_event(*args): 
    print args, sum(args) 


for k, g in groupby(L, key=lambda x:x["key"]["subkey"]): 
    g = list(g) 
    if len(g) > 1: 
     some_event(*(i["key"]["value"] for i in g)) 
+1

'len(x)> 1'應該是'len(g)> 1' – Nicolas

+0

好極了!爲什麼g需要成爲一個列表? –

+1

由於'groupby'返回的組是一個迭代器(參見[doc](http://docs.python.org/3.3/library/itertools.html#itertools.groupby)) – Nicolas

相關問題