基于非唯一值合并含空值的两个字典列表的实现方案
字典列表的匹配合并问题
问题背景
现有两个字典列表:
列表v
v = [{'call 1': 'debit card'}, {'call 2': 'debit card'}, {'call 3': 'payment limit'}, {'call 1': 'bond'}, {'call 2': 'mortgage'}, {'call 3': 'debit card'}, {'call 1': nan}, {'call 2': 'spending limit'}, {'call 3': nan}]
列表w
w = [{'cluster 1': 'payment limit'}, {'cluster 2': 'debit card'}, {'cluster 3': 'bond'}, {'cluster 1': 'spending limit'}, {'cluster 2': 'debit card'}, {'cluster 3': 'mortgage'}, {'cluster 1': None}, {'cluster 2': 'debit card'}, {'cluster 3': None}]
需求
- 移除两个列表中的空值(
nan、None) - 基于字典的值将两个列表合并,得到如下结果:
# desired outcome [{'call 3':{'cluster 1': 'payment limit'}}, {'call 1':{'cluster 2': 'debit card'}}, {'call 1':{'cluster 3': 'bond'}}, {'call 2':{'cluster 1': 'spending limit'}}, {'call 2':{'cluster 2': 'debit card'}}, {'call 3':{'cluster 2': 'debit card'}}]
核心难点
像debit card这类值同时出现在多个call键(call 1、call 2、call 3)中,需要为每个cluster分配唯一对应的call键,保证匹配关系正确。
解决方案
步骤1:清理空值并整理映射关系
分别处理两个列表,过滤掉空值,同时为每个值维护call键的队列和cluster键的队列——这样可以保证相同值的call和cluster按出现顺序一一对应,解决重复值的匹配问题。
代码实现
import pandas as pd from collections import defaultdict # 处理列表v:过滤空值,建立值到call键的队列映射 value_to_calls = defaultdict(list) for item in v: call_key, val = next(iter(item.items())) if pd.notna(val): value_to_calls[val].append(call_key) # 处理列表w:过滤空值,建立值到cluster键的队列映射 value_to_clusters = defaultdict(list) valid_cluster_items = [] for item in w: cluster_key, val = next(iter(item.items())) if val is not None: value_to_clusters[val].append(cluster_key) valid_cluster_items.append(item) # 按值匹配合并,从队列中按顺序取出对应call和cluster result = [] for cluster_item in valid_cluster_items: cluster_key, val = next(iter(cluster_item.items())) # 取出对应值的第一个call键并移除,避免重复分配 call_key = value_to_calls[val].pop(0) result.append({call_key: {cluster_key: val}}) print(result)
代码说明
- 用
defaultdict(list)为每个值维护call键的队列,确保相同值的call按原列表出现顺序排列;同理处理cluster键。 - 遍历清理后的cluster项,对每个cluster的取值,从对应值的call队列中取出第一个元素,完成匹配后从队列移除,保证每个cluster对应唯一的call键。
- 最终生成的结果完全符合预期的匹配关系。
内容的提问来源于stack exchange,提问作者Wiliam
相关产品推荐
相关产品推荐

