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

如何在Python中比较字典列表的元素值并提取匹配键,同时按相近值对键进行分组

解决字典键按值相近分组的问题

首先咱们得明确需求核心:对每个字典里的键,根据它们对应的值(列表中的数字),把那些值能通过差值≤3的链式关系连起来的键归为一组,组名用下划线拼接键名,最终得到每个字典对应的分组列表。

先拆解处理每个字典的关键步骤:

步骤1:整理数值与键的映射

先把每个键对应的所有数值都列出来,同时记录每个数值属于哪些键。比如第一个字典,我们会得到这样的映射:

6 → 'a'
7 → 'b'
16 → 'b'
13 → 'c'
32 → 'd'

步骤2:排序数值并构建聚类簇

把所有数值去重后排序,然后遍历排序后的列表:如果当前数值和前一个的差值≤3,就把两个数值对应的键合并到同一个簇;如果差值超过3,就把当前簇保存,开始新的簇。

拿第一个字典举例,排序后的数值是6,7,13,16,32:

  • 6和7差1≤3 → 簇包含键{'a','b'}
  • 13和16差3≤3 → 簇包含键{'b','c'}
  • 32单独成簇 → 簇包含键{'d'}

第二个字典排序后的数值是9,43,44,45,47,48,52,54:

  • 9单独成簇 → 簇包含键{'a'}
  • 43、44、45、47、48彼此差值都≤3 → 簇包含键{'b','c','d','e','f'}
  • 52和54差2≤3 → 簇包含键{'d','g'}

步骤3:将簇转为下划线拼接的字符串

把每个簇里的按键的原字典顺序排序(保证输出顺序和原字典一致),然后用下划线拼接成组名,就得到最终的分组列表。

完整实现代码

下面是用Python实现的代码,完全匹配需求:

def group_keys_by_value_proximity(dictionary, max_diff=3):
    # 构建数值到键的映射,同时收集所有数值
    num_to_keys = {}
    all_nums = []
    for key, values in dictionary.items():
        for num in values:
            if num not in num_to_keys:
                num_to_keys[num] = set()
            num_to_keys[num].add(key)
            all_nums.append(num)
    
    if not all_nums:
        return []
    
    # 去重排序数值,开始聚类
    sorted_nums = sorted(set(all_nums))
    clusters = []
    current_cluster_keys = num_to_keys[sorted_nums[0]].copy()
    prev_num = sorted_nums[0]
    
    for num in sorted_nums[1:]:
        if num - prev_num <= max_diff:
            current_cluster_keys.update(num_to_keys[num])
        else:
            clusters.append(current_cluster_keys)
            current_cluster_keys = num_to_keys[num].copy()
        prev_num = num
    clusters.append(current_cluster_keys)
    
    # 按原字典键顺序排序簇内键,拼接成字符串
    original_keys = list(dictionary.keys())
    grouped_strings = []
    for cluster in clusters:
        sorted_cluster = sorted(cluster, key=lambda k: original_keys.index(k))
        grouped_strings.append('_'.join(sorted_cluster))
    
    return grouped_strings

# 测试示例输入
l = [
    {'a': [6], 'b': [7, 16], 'c': [13], 'd': [32]},
    {'a': [9], 'b': [43], 'c': [44], 'd': [45, 52], 'e': [47], 'f': [48], 'g': [54]}
]

l2 = [group_keys_by_value_proximity(d) for d in l]
print(l2)
# 输出:[['a_b', 'b_c', 'd'], ['a', 'b_c_d_e_f', 'd_g']]

代码说明

  • 先处理数值和键的映射,避免重复计算;
  • 聚类时通过相邻数值的差值判断是否合并簇,保证符合“链式相近”的规则;
  • 最后按原字典键顺序排序簇内键,让输出结果更贴合原数据的顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:37:39