這使用collections.Counter。正如評論所表明的那樣,由於您輸入的結構稍微複雜 - 我可以提出最優雅的一個結構 - 一個長度的字典列表確實可以更好地實現爲單個字典。這也是我的代碼將它轉換成的東西,儘管如果你確實需要舊的數據結構,我已經提供了更多可能的轉換。如果你這樣做,我會建議使用元組作爲你的鍵值對,而不僅僅是單一長度的字典,如tuple_output
所示。我建議你使用output
或dict_output
。
from collections import Counter
d = {'Item1': [{'Name1': 3}, {'Name2': 4}, {'Name1':7}], 'Item2': [{'Name7': 44}, {'Name2': 3}, {'Name6':9}, {'Name6':2}] }
output = {}
for k, v in d.items():
c = Counter()
for sub_dict in v:
c.update(sub_dict)
output[k] = c
dict_output = {k: dict(v) for k, v in output.items()}
tuple_output = {k: v.most_common() for k, v in output.items()}
dict_list_output = {k: [{a: b} for a, b in v.most_common()] for k, v in output.items()}
print(output)
#{'Item1': Counter({'Name1': 10, 'Name2': 4}), 'Item2': Counter({'Name7': 44, 'Name6': 11, 'Name2': 3})}
print(dict_output)
#{'Item1': {'Name1': 10, 'Name2': 4}, 'Item2': {'Name7': 44, 'Name2': 3, 'Name6': 11}}
print(tuple_output)
#{'Item1': [('Name1', 10), ('Name2', 4)], 'Item2': [('Name7', 44), ('Name6', 11), ('Name2', 3)]}
print(dict_list_output)
#{'Item1': [{'Name1': 10}, {'Name2': 4}], 'Item2': [{'Name7': 44}, {'Name6': 11}, {'Name2': 3}]}
當然,如果您完全更改起始數據結構,它將變得更容易管理。如果您使用字典從字符串到計數器,可以使用計數器接口輕鬆地更新它(指link)
編輯:
只是爲了好玩,在一個行來完成:
results = {item: reduce(lambda a, b: [a, a.update(b)][0], names, Counter()) for item, names in d.items()}
它受到你的啓發,除了這隻爲每個列表構建一個Counter實例(作爲reduce的初始值給出)。此外,Counter.update已經到位,因此需要一點點高爾夫技巧才能正確減少。如果您正在閱讀本文,您可能不應該使用它,而是從一開始就使用計數器或字典構建數據結構,如前所述。
是否有一個原因,你有類型的字典列表?既然你想把一個鍵的多個副本摺疊成一個鍵,那麼你可能只有一個詞典。抽象地說,無論如何,你只是在笨拙地做着事情。 –