1

これが私の辞書のリストです:

dict_list=[{'red':3, 'orange':4}, {'blue':1, 'red':2},
   {'brown':4, 'orange':7}, {'blue':4, 'pink':10}]

これが私のdesired outcome

[{'red':5, 'orange':11, 'blue':5, 'brown':4, 'pink':10}]

sum を使用してみましたが、エラー メッセージが表示されました。更新はここでは適切ではないようです。

 update_dict={}
 for x in dict_list:
     for a in x.items():
         update_dict+= x[a]

助言がありますか?ありがとう。

4

2 に答える 2

3

defaultdictあなたの友達です。

from collections import defaultdict

d = defaultdict(int)

for subdict in dict_list:
    for k,v in subdict.items():
        d[k] += int(v)

Python 3 構文。辞書に string 値と int 値が混在しているため、これint(v)が必要です。

目的の出力を取得するには:

d
Out[16]: defaultdict(<class 'int'>, {'orange': 11, 'blue': 5, 'pink': 10, 'red': 5, 'brown': 4})

[dict(d)]
Out[17]: [{'blue': 5, 'brown': 4, 'orange': 11, 'pink': 10, 'red': 5}]
于 2013-10-12T03:39:18.990 に答える
0

dict_listyourをタプルのリストに変換して、これを少し単純化しましょう。itertools.chainはこういうのが得意です。

from itertools import chain

dict_list=[{'red':'3', 'orange':4}, {'blue':'1', 'red':2},
  {'brown':'4', 'orange':7}, {'blue':'4', 'pink':10}]

def dict_sum_maintain_types(dl):
  pairs = list(chain.from_iterable(i.items() for i in dl))

  # Initialize the result dict. 
  result = dict.fromkeys(chain(*dl), 0)

  # Sum the values as integers.
  for k, v in pairs:
    result[k] += int(v)

  # Use the type of the original values as a function to cast the new values
  # back to their original type.
  return [dict((k, type(dict(pairs)[k])(v)) for k, v in result.items())] 

>>> dict_sum_maintain_types(dict_list)
[{'orange': 11, 'blue': '5', 'pink': 10, 'red': 5, 'brown': '4'}]
于 2013-10-12T03:53:06.220 に答える