Skip to main content
 首页 » 编程设计

python之按键合并字典列表的更好方法

2025年05月04日14虾米姐

我有一个字典列表和一个可以从列表中的每个字典中提取值的函数。目标是我得到一个字典,其中的键是当我将给定字典列表中的字典传递给给定函数时返回的值。返回字典中的相应值应该是给定函数返回相应键的原始字典列表中字典的子集。

我知道这个解释很困惑,所以我在一个实现中展示它:

keygen = lambda x: x['key'] 
 
data = [{'key': 'key1', 
         'data': 'value2'}, 
        {'key': 'key3', 
         'data': 'value2'}, 
        {'key': 'key2', 
         'data': 'value2'}, 
        {'key': 'key2', 
         'data': 'value2'}, 
        {'key': 'key1', 
         'data': 'value2'}] 
 
def merge_by_keygen(data, keygen): 
    return_value = {}  
    for dataset in data: 
        if keygen(dataset) not in return_value.keys(): 
            return_value[keygen(dataset)] = []  
        return_value[keygen(dataset)].append(dataset) 
    return return_value 
 
merge_by_keygen(data, keygen) 

返回:

{'key3': [{'data': 'value2', 'key': 'key3'}],  
 'key2': [{'data': 'value2', 'key': 'key2'}, {'data': 'value2', 'key': 'key2'}],  
 'key1': [{'data': 'value2', 'key': 'key1'}, {'data': 'value2', 'key': 'key1'}]} 

我正在寻找相同逻辑的更好、更紧凑的实现,例如一些字典/列表理解。谢谢!

请您参考如下方法:

这是由 itertools.groupby 处理的理想问题

实现

from itertools import groupby 
from operator import itemgetter 
groups = groupby(sorted(data, key = itemgetter('key')), key = itemgetter('key')) 
data_dict = {k : list(g) for k, g in groups} 

或者如果你更喜欢单行

data_dict = {k : list(g)  
             for k, g in groupby(sorted(data,  
                                        key = itemgetter('key')),  
                                 key = itemgetter('key'))} 

输出

{'key1': [{'data': 'value2', 'key': 'key1'}, 
          {'data': 'value2', 'key': 'key1'}], 
 'key2': [{'data': 'value2', 'key': 'key2'}, 
          {'data': 'value2', 'key': 'key2'}], 
 'key3': [{'data': 'value2', 'key': 'key3'}]}