如何在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
相关产品推荐
相关产品推荐

