2016-11-12 28 views
0

我已經一個字典結構類似於[A] [B] =(C),例如:使用二級密鑰總結字典值

{'cat': {1:1, 2:3, 3:1, 4:1}, 'dog': {1:8, 2:2, 3:4}, 'egg': {5:1, 6:2}, 'frog': {2:1, 4:1, 5:1}, 'nuts': {3:1}, 'idea': {4:1}} 

我想什麼能夠做的是搜索由[b]鍵並對相應的c進行求和。所以我會得到以下輸出:

1:9,2:6,3:6 ...等等。

這是否需要重組字典?

回答

2

,您可以在其上類型的字典和總結值使用collections.defaultdict每個鍵的字典中的值進行迭代。然後,你只需訪問結果字典找出加值爲每個鍵,無需搜索:

from collections import defaultdict 

d = {'cat': {1:1, 2:3, 3:1, 4:1}, 'dog': {1:8, 2:2, 3:4}, 'egg': {5:1, 6:2}, 'frog': {2:1, 4:1, 5:1}, 'nuts': {3:1}, 'idea': {4:1}} 

result = defaultdict(int) 
for i in d.values(): 
    for j in i: 
     result[j] += i[j] 

print(result) 
# defaultdict(<class 'int'>, {1: 9, 2: 6, 3: 6, 4: 3, 5: 2, 6: 2}) 

>>> print(result[1]) 
9 
+0

您也可以使用['collections.Counter'](https://docs.python.org/2/library /collections.html#collections.Counter),默認情況下已從零開始提供數字值。 –

0

我假設你有這樣的解釋:

d = {'cat': {1:1, 2:3, 3:1, 4:1}, 'dog': {1:8, 2:2, 3:4}, 'egg': {5:1, 6:2}, 'frog': {2:1, 4:1, 5:1}, 'nuts': {3:1}, 'idea': {4:1}}} 

現在我們來寫這將需要一個參數(整數),總結所有值在所有內部字典這個整數的函數。

def calc(b): 
    result = 0 
    for val in d.values(): 
     if b in val: 
      result += val[b] 
0

如果你需要的是總的,那麼你可以sum了所有使用值:

>>> b = 2 
>>> sum(a.get(b, 0) for a in d.values()) 
6 

如果你想把所有的b s然後使用collections.Counter()其行爲類似於dict做所有的繁重:

>>> from collections import Counter 
>>> sum((Counter(a) for a in d.values()), Counter()) 
Counter({1: 9, 2: 6, 3: 6, 4: 3, 5: 2, 6: 2}) 

但是,如果你真的很挑剔並希望dict

>>> dict(sum((Counter(a) for a in d.values()), Counter())) 
{1: 9, 2: 6, 3: 6, 4: 3, 5: 2, 6: 2} 
+0

答案應該是一本字典。 –