计算一个字典中的重复键

时间:2013-07-17 16:56:17

标签: python

我有这样的字典:

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

我想按stat计算week密钥, 我试过这个:

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

但我得到了这个结果:

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

我不明白为什么12为什么只是上周呢?

我该怎么办呢?

2 个答案:

答案 0 :(得分:2)

循环遍历字典键,然后多次计算相同的键。你的循环体没有任何动态:

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

如果词典中有12个键,则上述行执行12次。

如果您希望看到您的循环访问具有相同名称的多个键,则您会误解字典的工作方式。字典将唯一键映射到值。在文字字典声明中多次指定一个键将导致一个字典只包含每个键的一个副本,其值为一个

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

在CPython中,编译器会为每个定义的键提供 last 值,这就是您在示例词典中看到'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 :(得分:1)

我认为你提出的这个词是错的。一个字典有重复的键将被覆盖。你的dict实际上是这样的:

>>> 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'}]

你给的循环是没有意义的。它不会做任何循环并将运算符保持在相同的元素上。

>>> 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})})
>>>