2013-07-17 67 views
-1

我有這樣一個字典:在字典計數重複鍵

newdict ={'category': 'failure', 'week': '1209', 'stat': 'tdc_ok', 'severityDue': '2_critic', 'category': 'failure', 'week': '1210', 'stat': 'tdc_nok', 'severityDue': '2_critic'} 

我想week計數stat鍵, 我已經試過這樣:

>>> counterdict = defaultdict(Counter) 
>>> for i in newdict : 
     counterdict[int(newdict['week'])][newdict['stat']]+=1 

,但我得到這個結果:

[(1210, Counter({'tdc_nok': 12}))] 

我不明白爲什麼12爲什麼只是最後一週?

我該怎麼做?

+3

提示:在分配它後直接打印'newdict' ...您可能會感到驚訝... –

+1

字典必須具有唯一鍵。你確定他們沒有被你的代碼覆蓋嗎? –

+0

我不明白這個問題,你能否給出更多的上下文? – mbdavis

回答

2

你循環在你的字典鍵,再算上相同的密鑰很多倍。關於你的循環體沒有什麼動態的:

counterdict[int(newdict['week'])][newdict['stat']]+=1 

如果你的字典中有12個鍵,上面的行會執行12次。

如果您希望看到您的循環訪問多個鍵具有相同的名稱,您誤會了字典的工作方式。字典地圖獨特的鍵值。在字面解釋聲明中指定鍵不止一次將導致只有一個每個密鑰副本一本字典,與他們的價值觀的一個

>>> {'foo': 'bar', 'foo': 'baz'} 
{'foo': 'baz'} 

在CPython中,編譯器給你每個鍵最後值來定義,這就是爲什麼你在你的例子字典看到'week': '1210'

你的樣品輸入字典最終只有四個獨特的鍵:

>>> newdict ={'category': 'failure', 'week': '1209', 'stat': 'tdc_ok', 'severityDue': '2_critic', 'category': 'failure', 'week': '1210', 'stat': 'tdc_nok', 'severityDue': '2_critic'} 
>>> newdict 
{'category': 'failure', 'week': '1210', 'stat': 'tdc_nok', 'severityDue': '2_critic'} 
>>> len(newdict) 
4 

這讓我懷疑你跑你的循環3次來到12的計數(遍歷字典爲您提供了4個按鍵) 。

如果你有字典的實際列表,然後取每個單獨的字典從該列表並使用它作爲你的計數,計算:

for d in list_of_dictionaries: 
    counterdict[int(d['week'])][d['stat']] += 1 

其中list_of_dictionaries可能是:

[ 
    {'category': 'failure', 'week': '1209', 'stat': 'tdc_ok', 'severityDue': '2_critic'}, 
    {'category': 'failure', 'week': '1210', 'stat': 'tdc_nok', 'severityDue': '2_critic'}, 
] 
1

我覺得你給的字典是錯誤的。一個字典有重複的鍵將被覆蓋。你的字典居然是這樣的:

>>> newdict 
{'category': 'failure', 'week': '1210', 'stat': 'tdc_nok', 'severityDue': '2_critic'} 

我想你想要的是這樣的:

>>> newdict =[{'category': 'failure', 'week': '1209', 'stat': 'tdc_ok', 'severityDue': '2_critic'}, {'category': 'failure', 'week': '1210', 'stat': 'tdc_nok', 'severityDue': '2_critic'}] 

而你給了循環是meaingless。它不會做任何循環,並保持操作員在相同的元素上。

>>> a = defaultdict(Counter) 
>>> for item in newdict: 
...  a[int(item['week'])][item['stat']] += 1 
... 
>>> a 
defaultdict(<class 'collections.Counter'>, {1209: Counter({'tdc_ok': 1}), 1210: Counter({'tdc_nok': 1})}) 
>>>