Python中从字典的列表列表值中查找最相似数值的方法
问题描述
我有一个值为列表列表的字典:
dict1 = {"['x1', 'y1']": [['r1', 'r2'], [78, 125]], "['x1', 'y1']": [['r1', 'r2'], [77, 112]], "['x1', 'y1']": [['r1', 'r2'], [73, 110]], "['x2', 'y2']": [['r2', 'r3'], [71, 103]]}
需要查找与输入列表列表匹配的内容:
input1 = [['r1', 'r2'], [72, 112]]
要求:第一个子列表['r1', 'r2']需直接匹配,第二个子列表[72,112]要查找字典中最近似的数值(比如示例中的[73,110]),期望输出:
output = { "['x1', 'y1']": [['r1', 'r2'], [73, 110]]}
实现思路与代码
核心步骤
- 先筛选出字典中第一个子列表与输入完全匹配的条目,排除不满足的项;
- 对筛选后的条目,计算它们第二个子列表与输入第二个子列表的欧氏距离(也可替换为曼哈顿距离),距离最小的即为最近似结果;
- 提取距离最小的条目作为最终输出。
代码实现
import math def find_closest_match(target_dict, input_data): # 拆分输入的标签和数值子列表 target_tag, target_nums = input_data candidates = {} # 筛选标签匹配的候选条目 for key, value in target_dict.items(): current_tag, current_nums = value if current_tag == target_tag: candidates[key] = value if not candidates: return {} # 计算两个二维数值列表的欧氏距离 def calculate_distance(nums1, nums2): return math.sqrt((nums1[0] - nums2[0])**2 + (nums1[1] - nums2[1])**2) # 找出距离最小的条目 closest_key = min(candidates.keys(), key=lambda k: calculate_distance(candidates[k][1], target_nums)) return {closest_key: candidates[closest_key]} # 测试执行 dict1 = {"['x1', 'y1']": [['r1', 'r2'], [78, 125]], "['x1', 'y1']": [['r1', 'r2'], [77, 112]], "['x1', 'y1']": [['r1', 'r2'], [73, 110]], "['x2', 'y2']": [['r2', 'r3'], [71, 103]]} input1 = [['r1', 'r2'], [72, 112]] output = find_closest_match(dict1, input1) print(output)
补充说明
- 原字典存在重复键
"['x1', 'y1']",Python字典会自动保留最后一次赋值的键值对,实际使用时建议避免重复键,或改用列表存储条目; - 若需使用曼哈顿距离,只需修改距离计算函数为:
return abs(nums1[0]-nums2[0]) + abs(nums1[1]-nums2[1]); - 若存在多个距离相同的最接近项,代码会返回第一个遇到的条目(由
min函数特性决定)。
内容的提问来源于stack exchange,提问作者Rory
相关产品推荐
相关产品推荐

