-2

例えば:

list  = [{'a':1122,'b':'qqqq'},{'a':1244,'b':'qqqq'},{'a':1233,'b':'wwww'}]

2つの辞書がキーbに同じ値を含む繰り返し値を連結したい

私はそれらをこれらのようにしたい:

list = [{'a':2366,'b':'qqqq'},{'a':1233,'b':'wwww'}]
4

3 に答える 3

2

キーは常に と になると思いaますb

の値をキーとして中間 (デフォルト) 辞書を作成し、 の値をb合計しますa。その後、データをリストに戻します。

import collections

data = [{'a':1122,'b':'qqqq'},{'a':1244,'b':'qqqq'},{'a':1233,'b':'wwww'}]

adder = collections.defaultdict(int)
for item in data:
    adder[item['b']] += item['a']

data = [{'a':value, 'b':key} for key, value in adder.iteritems()]
print(data)
于 2012-11-09T14:01:24.353 に答える
1

「qqqq」と「wwww」をどのように合計しますか?

たぶん、このコード スニペットはあなたが望むことをするでしょう:

d = [{'a':1122,'b':'qqqq'},{'a':1244,'b':'qqqq'},{'a':1233,'b':'wwww'}]
res = []

for item in d:
    for key, value in item.iteritems():
        if key not in res:
            res[key] = []
        res[key].append(value)

print res
>>> {'a': [1122, 1244, 1233], 'b': ['qqqq', 'qqqq', 'wwww']}
于 2012-11-09T13:50:37.323 に答える
1

これは私が思いつくことができる最も一般的な解決策です:

from collections import Counter,defaultdict

def sum_list_dict(lst,spec):
    d = defaultdict(list)

    #accumulate dictionaries with same "special value"
    for dd in lst:
        d[ dd[spec] ].append(dd)

    out = []
    for v in d.values():
        #Add all keys together.  Previous version excluded the special key,
        #but that really isn't necessary as we overwrite it next anyway
        new_dict = sum((Counter(x) for x in v),Counter())
        new_dict[spec] = v[0][spec]
        out.append(dict(new_dict))
    return out

lst = [{'a':1122,'b':'qqqq'},{'a':1244,'b':'qqqq'},{'a':1233,'b':'wwww'}]
print (sum_list_dict(lst,'b'))

私が知る限り、この答えは次のこと以外は仮定していません。

  • すべての辞書にspec鍵があります。
  • 出力内の辞書の順序は重要ではありません (おそらく修正される可能性があります)
  • 2 つの dict が同じキーを持つ場合、関連付けられた値は一緒に追加できる必要があります
  • collections.Counter適切なクラス (python2.7+)にアクセスできる
于 2012-11-09T14:19:40.600 に答える