如何基于指定键合并两个多数键值对不同的字典列表
按指定键合并两个字典列表的实现方案
这其实是个非常典型的字典合并场景,刚好你的情况里除了symbol作为匹配键,两个列表里的其他字典键完全不重叠,处理起来反而更直接。给你分享几个实用的实现思路:
方法1:字典映射+循环(高效易读)
先把其中一个列表转换成以symbol为键的映射字典,这样后续查找匹配项的效率是O(1),然后遍历另一个列表完成合并:
dl1 = [{'symbol': 'ETHBTC', 'price': '0.06081700'}, {'symbol': 'LTCBTC', 'price': '0.00405000'}] dl2 = [{'symbol': 'ETHBTC', 'makerCommission': '0.001', 'takerCommission': '0.001'}, {'symbol': 'LTCBTC', 'makerCommission': '0', 'takerCommission': '0.001'}] # 将dl2转换为symbol到完整字典的映射 symbol_lookup = {item['symbol']: item for item in dl2} merged_result = [] for item in dl1: target_symbol = item['symbol'] # 合并两个字典:因为你的场景没有重复键,顺序不影响;如果有重复键,后面的会覆盖前面的 combined_item = {**item, **symbol_lookup[target_symbol]} merged_result.append(combined_item) print(merged_result)
这个方法的优势是时间复杂度低(O(n+m),n和m分别是两个列表的长度),逻辑清晰,不管数据量大小都能稳定运行。如果担心两个列表的symbol不完全匹配(比如有的symbol只在其中一个列表里),可以加个判断分支处理缺失情况:
merged_result = [] for item in dl1: target_symbol = item['symbol'] if target_symbol in symbol_lookup: combined_item = {**item, **symbol_lookup[target_symbol]} merged_result.append(combined_item) else: # 可根据需求选择跳过,或者保留原item merged_result.append(item.copy())
方法2:列表推导式(简洁紧凑)
如果喜欢更简洁的代码风格,可以把上面的逻辑写成列表推导式,功能完全一致:
symbol_lookup = {d['symbol']: d for d in dl2} merged_result = [{**d, **symbol_lookup[d['symbol']]} for d in dl1]
方法3:Pandas(适合大数据/多表场景)
如果你的数据本来就在Pandas生态中处理,或者需要更灵活的匹配规则(比如左连接、右连接),用merge方法会更方便:
import pandas as pd # 转成DataFrame df1 = pd.DataFrame(dl1) df2 = pd.DataFrame(dl2) # 按symbol内连接(只保留两边都有的symbol) merged_df = pd.merge(df1, df2, on='symbol', how='inner') # 转回字典列表 merged_result = merged_df.to_dict('records') print(merged_result)
这个方法的优势是扩展性强,比如要处理多个字典列表合并、缺失值填充、过滤特定symbol等需求,Pandas的API都能轻松实现。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

