3

Pythonで2つの辞書がある場合、具体的にはそのように見えるカウンターオブジェクト

c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})

次のように、これらの辞書を組み合わせて、結果がリストの辞書になるようにすることはできますか。

c3 = {'item1': [4,6], 'item2':[2,2], 'item3': [5,1], 'item4': [3], 'item5': [9]}

ここで、各値は適切なキーからの前の辞書のすべての値のリストであり、2 つの元の辞書の間に一致するキーがない場合、1 つの要素リストを含む新しいキューが追加されます。

4

3 に答える 3

8
from collections import Counter
c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})
c3 = {}
for c in (c1, c2):
    for k,v in c.iteritems():
        c3.setdefault(k, []).append(v)

c3今でしょ:{'item1': [4, 6], 'item2': [2, 2], 'item3': [5, 1], 'item4': [3], 'item5': [9]}

于 2012-07-24T13:42:53.147 に答える
2

またはリスト内包表記で:

from collections import Counter
c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})
merged = {}
for k in set().union(c1, c2):
    merged[k] = [d[k] for d in [c1, c2] if k in d]

>>> merged
{'item2': [2, 2], 'item3': [5, 1], 'item1': [4, 6], 'item4': [3], 'item5': [9]}

説明

  1. 存在するすべてのキーを匿名セットにスローします。(セットです => 重複キーなし)
  2. すべてのキーについて、3 を実行します。
  3. 辞書のリスト内のすべての辞書 d に対して[c1, c2]
    • 現在処理中のキーkが存在する かどうかを確認する
      • true の場合:d[k]結果のリストに式を含めます
      • そうでない場合: 次の反復に進みます

これは、多くの例を含むリスト内包表記の詳細な紹介です。

于 2012-07-24T14:23:05.903 に答える
1

使用できますdefaultdict

>>> from collections import Counter, defaultdict
>>> c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
>>> c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})
>>> c3 = defaultdict(list)
>>> for c in c1, c2:
...     for k, v in c.items():
...         c3[k].append(v)
... 
>>> c3
defaultdict(<type 'list'>, {'item2': [2, 2], 'item3': [5, 1], 'item1': [4, 6],
'item4': [3], 'item5': [9]})
于 2012-07-24T15:31:27.993 に答える