如何按两组键值对过滤两个字典列表并将匹配项分组?
字典列表按匹配键值对分组解决方案
嘿,我来帮你搞定这个分组需求!咱们要做的是根据Symbol和Time这两个键的组合(这俩是唯一标识每条记录的核心字段),把两个字典列表里的条目分成三类:两边都存在的匹配条目、只在List_D1里的条目、只在List_D2里的条目。下面是具体的实现步骤和代码:
实现思路
- 给每个字典生成唯一标识键:用
(Symbol, Time)元组,精准匹配同一股票同一时间的记录; - 把两个列表转换成以这个唯一键为索引的字典,方便快速查找和对比;
- 找出两个字典的共同键、List_D1独有的键、List_D2独有的键;
- 根据这些键提取对应的条目,完成分组。
代码实现
# 原始数据 List_D1 = [ {'Symbol':'GFX','Time':'9:36am', 'Change':-0.18, 'Volume':181800}, {'Symbol':'AIG','Time':'9:36am', 'Change':-0.15, 'Volume': 195500}, {'Symbol':'AXP','Time':'9:36am', 'Change':-0.46, 'Volume': 935000}, ] List_D2 = [ {'Symbol':'AA','Time':'7:36am', 'Change':-0.08, 'Volume':181800}, {'Symbol':'AIG','Time':'9:36am', 'Change':0.99, 'Volume': 197500}, {'Symbol':'GFX','Time':'9:36am', 'Change':-0.46, 'Volume': 935000}, ] # 生成以(Symbol, Time)为键的字典,方便快速匹配 dict_d1 = {(item['Symbol'], item['Time']): item for item in List_D1} dict_d2 = {(item['Symbol'], item['Time']): item for item in List_D2} # 找出各类键的集合 common_keys = dict_d1.keys() & dict_d2.keys() # 两边都有的键 d1_only_keys = dict_d1.keys() - dict_d2.keys() # 仅D1有的键 d2_only_keys = dict_d2.keys() - dict_d1.keys() # 仅D2有的键 # 组装分组结果 grouped_result = { '匹配条目': [(dict_d1[key], dict_d2[key]) for key in common_keys], '仅List_D1存在': [dict_d1[key] for key in d1_only_keys], '仅List_D2存在': [dict_d2[key] for key in d2_only_keys] } # 打印查看结果 print("分组后的结果:") for group_name, items in grouped_result.items(): print(f"\n{group_name}:") for item in items: print(item)
运行结果
运行代码后会得到如下输出:
分组后的结果: 匹配条目: ({'Symbol': 'GFX', 'Time': '9:36am', 'Change': -0.18, 'Volume': 181800}, {'Symbol': 'GFX', 'Time': '9:36am', 'Change': -0.46, 'Volume': 935000}) ({'Symbol': 'AIG', 'Time': '9:36am', 'Change': -0.15, 'Volume': 195500}, {'Symbol': 'AIG', 'Time': '9:36am', 'Change': 0.99, 'Volume': 197500}) 仅List_D1存在: {'Symbol': 'AXP', 'Time': '9:36am', 'Change': -0.46, 'Volume': 935000} 仅List_D2存在: {'Symbol': 'AA', 'Time': '7:36am', 'Change': -0.08, 'Volume': 181800}
如果之后需要调整匹配的键(比如只用Symbol匹配),只需要修改生成唯一键的逻辑就行~
内容的提问来源于stack exchange,提问作者Jia
相关产品推荐
相关产品推荐

