在Python中合并字典列表
我有一个包含6个字典的列表:
[{'fruit':'Apple', 'Color':'red', 'weight':'10'},
{'fruit':'Banana', 'Color':'yellow', 'weight':'20'},
{'fruit':'Kiwi', 'Color':'Green', 'weight':'15'},
{'Veggie':'Onion', 'Color':'white', 'price':'10'},
{'Veggie':'Cabbage', 'Color':'Light Green', 'price':'30'},
{'Leafy':'Spinach', 'Color':'Dark Green', 'quantity':'30'}]
我需要把它转换成:
[{'Fruit':[Apple, Banana, Kiwi], 'Color':[red, yellow, green], 'weight':[10,20,15]},
{'Veggie':[Onion, Cabbage], 'Color':[white, light green], 'price':[10,30]},
{'Leafy':[Spinach], 'Color':[Dark Green], 'quantity':[30]}]
我尝试了很多方法,比如比较相邻的字典,使用map来跟踪具有相同键的字典,但都没有成功。有没有人能给我一些代码逻辑上的建议?谢谢!
2 个回答
1
使用 itertools.groupby
,把字典的键作为分组的依据。这是基于一个假设:相同键的字典已经排在一起了,就像例子中那样。不过,你可以通过 org_list.sort(key=sorted)
来确保它们按相同的键进行排序。
from pprint import pprint
from itertools import groupby
org_list = [{'fruit':'Apple', 'Color':'red', 'weight':'10'},
{'fruit':'Banana', 'Color':'yellow', 'weight':'20'},
{'fruit':'Kiwi', 'Color':'Green', 'weight':'15'},
{'Veggie':'Onion', 'Color':'white', 'price':'10'},
{'Veggie':'Cabbage', 'Color':'Light Green', 'price':'30'},
{'Leafy':'Spinach', 'Color':'Dark Green', 'quantity':'30'}]
result_list = []
for group_key, group in groupby(org_list, key=set):
group_dict = {} # new dict to collect a similar key set
for dct in group:
for key, value in dct.items():
if key not in group_dict:
group_dict[key] = [value] # start a new key list
else:
group_dict[key].append(value) # append to existing key
result_list.append(group_dict) # finished with that key set
pprint(result_list, width=120)
输出结果:
[{'Color': ['red', 'yellow', 'Green'], 'fruit': ['Apple', 'Banana', 'Kiwi'], 'weight': ['10', '20', '15']},
{'Color': ['white', 'Light Green'], 'Veggie': ['Onion', 'Cabbage'], 'price': ['10', '30']},
{'Color': ['Dark Green'], 'Leafy': ['Spinach'], 'quantity': ['30']}]
2
试试这个:
lst = [
{"fruit": "Apple", "Color": "red", "weight": "10"},
{"fruit": "Banana", "Color": "yellow", "weight": "20"},
{"fruit": "Kiwi", "Color": "Green", "weight": "15"},
{"Veggie": "Onion", "Color": "white", "price": "10"},
{"Veggie": "Cabbage", "Color": "Light Green", "price": "30"},
{"Leafy": "Spinach", "Color": "Dark Green", "quantity": "30"},
]
out = {}
for d in lst:
out.setdefault(frozenset(d), []).append(d)
out = [{kk: [d[kk] for d in v] for kk in k} for k, v in out.items()]
print(out)
输出结果是:
[
{
"Color": ["red", "yellow", "Green"],
"fruit": ["Apple", "Banana", "Kiwi"],
"weight": ["10", "20", "15"],
},
{
"Color": ["white", "Light Green"],
"price": ["10", "30"],
"Veggie": ["Onion", "Cabbage"],
},
{"Color": ["Dark Green"], "Leafy": ["Spinach"], "quantity": ["30"]},
]