-1

我有一个这样的字典:

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,为什么只有最后一周?

请问我该怎么做?

4

2 回答 2

3

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

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'},
]
于 2013-07-17T17:03:02.340 回答
2

我认为你给出的 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})})
>>> 
于 2013-07-17T17:07:48.620 回答