在Python中合并字典列表

-2 投票
2 回答
61 浏览
提问于 2025-04-14 18:20

我有一个包含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"]},
]

撰写回答