You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中合并具有共同值的字典项?(含DataFrame场景)

合并字典中共享值的项:两种实现方式对比

结论:直接操作字典更简便

如果已经拿到目标字典,直接用**连通分量(Union-Find)**的方式处理逻辑更直接,代码轻量且无需依赖Pandas;如果还在DataFrame的处理流程中,用Pandas展开后再处理也能实现,但步骤稍多。


方法一:直接操作字典(推荐)

核心思路是把每个值和对应的键绑定,通过Union-Find算法找到所有共享值的键的连通组,最后合并每组的键和值:

from collections import defaultdict

# 目标字典
d = {'A': ['tango', 'bravo', 'alpha'],
     'B': ['bravo', 'test'],
     'C': ['romero', 'test'],
     'D': ['delta']}

# 1. 建立「值→关联键列表」的映射
value_to_keys = defaultdict(list)
for key, values in d.items():
    for val in values:
        value_to_keys[val].append(key)

# 2. 实现Union-Find算法,找到连通的键
parent = {key: key for key in d.keys()}

def find(u):
    # 查找根节点,带路径压缩
    while parent[u] != u:
        parent[u] = parent[parent[u]]
        u = parent[u]
    return u

def union(u, v):
    # 合并两个连通分量
    u_root = find(u)
    v_root = find(v)
    if u_root != v_root:
        parent[v_root] = u_root

# 遍历每个值对应的键,合并连通的键
for keys in value_to_keys.values():
    if len(keys) >= 2:
        first_key = keys[0]
        for key in keys[1:]:
            union(first_key, key)

# 3. 按连通组分组合并键和值
key_groups = defaultdict(list)
value_groups = defaultdict(set)

for key in d.keys():
    root = find(key)
    key_groups[root].append(key)
    value_groups[root].update(d[key])

# 生成最终结果字典
result = {}
for root in key_groups:
    # 按字母排序键,保证输出一致
    combined_key = ' , '.join(sorted(key_groups[root]))
    result[combined_key] = value_groups[root]

print(result)

输出结果:

{'A , B , C': {'alpha', 'bravo', 'romero', 'test', 'tango'}, 'D': {'delta'}}

方法二:用Pandas处理

如果是从DataFlow出发,可以先展开列表列,再复用连通分量的逻辑:

import pandas as pd
from collections import defaultdict

# 原始DataFrame
df = pd.DataFrame(
    {'Column1': ['A', 'B', 'C', 'D'],
     'Column2': [['tango', 'bravo', 'alpha'], ['bravo', 'test'], ['romero', 'test'], ['delta']]
    })

# 1. 展开Column2中的列表,每行对应一个值
df_exploded = df.explode('Column2')

# 2. 建立「值→关联键列表」的映射
value_to_keys = df_exploded.groupby('Column2')['Column1'].apply(list).to_dict()

# 3. 同样用Union-Find找连通组
parent = {key: key for key in df['Column1']}

def find(u):
    while parent[u] != u:
        parent[u] = parent[parent[u]]
        u = parent[u]
    return u

def union(u, v):
    u_root = find(u)
    v_root = find(v)
    if u_root != v_root:
        parent[v_root] = u_root

for keys in value_to_keys.values():
    if len(keys) >= 2:
        first_key = keys[0]
        for key in keys[1:]:
            union(first_key, key)

# 4. 分组合并键和值
df['group_root'] = df['Column1'].apply(find)
grouped = df.groupby('group_root').agg(
    combined_key=('Column1', lambda x: ' , '.join(sorted(x))),
    combined_values=('Column2', lambda x: set().union(*x))
)

# 转换为目标字典
result_df = grouped.set_index('combined_key')['combined_values'].to_dict()
print(result_df)

输出结果和方法一完全一致。


内容的提问来源于stack exchange,提问作者Gab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:36:16