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

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]]}
实现思路与代码

核心步骤

  1. 先筛选出字典中第一个子列表与输入完全匹配的条目,排除不满足的项;
  2. 对筛选后的条目,计算它们第二个子列表与输入第二个子列表的欧氏距离(也可替换为曼哈顿距离),距离最小的即为最近似结果;
  3. 提取距离最小的条目作为最终输出。

代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:37:45