-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 回実行されます。

ループが同じ名前の複数のキーにアクセスすることを期待していた場合、辞書がどのように機能するかを誤解しています。辞書は一意のキーを値にマップします。リテラル ディクショナリ宣言でキーを複数回指定すると、各キーのコピーが1 つだけのディクショナリになり、その値の1 つが含まれます。

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

CPython では、コンパイラは定義されたキーごとに最後の'week': '1210'値を提供します。これが、例の辞書に表示される理由です。

サンプル入力ディクショナリは、最終的に 4 つの一意のキーのみになります。

>>> 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 に答える