2013-07-17 41 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})}) 
>>>