在python-lis中查找最近的值对

2024-09-30 20:31:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本这样的字典:

d = {'ID_1':[(10, 20), (40, 60), (125, 200)], 'ID_2': [(75, 100), (250, 300)]}

位置和身份证:

^{pr2}$

我想在列表中找到最接近测试pos的值对。在

我在下面试过了:

if IDed in d:
    y = d[IDed]
    closest = min(y, key=lambda x:abs(x-pos))

这不起作用,因为它不是一个包含单个值的列表。有没有其他方法可以使用类似的方法来完成这项工作。如果没有,我可以通过索引列表并计算每个值对之间的距离来找到解决问题的方法。然而,我认为这样做效率不高。在


Tags: 方法lambdakeyinposid列表if
2条回答

我想你应该找到平均值与pos值最接近的一对。。。 所以答案是:

d = {'ID_1':[(10, 20), (40, 60), (125, 200)], 'ID_2': [(75, 100), (250, 300)]}
pos = 70

closest = (0, 0)

IDed = "ID_1"

for i in d.items():
    if IDed == i[0]:
        for x in i[1]:
            avg = (x[0]+x[1])/2
            avg_closest = (closest[0]+closest[1])/2
            if abs(pos-avg) < abs(pos-avg_closest):
                closest = x

print closest

你真的很亲密。波纹管是一种有效的解决方案。在

d = {'ID_1': [(10, 20), (40, 60), (125, 200)], 'ID_2': [(75, 100), (250, 300)]}    
pos = 70
IDed = 'ID_1'

closest = min(d[IDed], key=lambda x: min(abs(y - pos) for y in x)) if IDed in d else None    
print(closest)
# (40, 60)

代码的问题是,您试图使用x - pos作为整个元组(例如,(40,60)),而pos是整目标值。在


您可以考虑将其包装在函数中,以避免代码重复,以防需要多次运行它。在

^{pr2}$

请注意,术语在嵌套在初始字典中的列表中的出现顺序对于例如d = {'ID_1': [(10, 20), (40, 69), (71, 200)], ...}这样的情况非常重要。术语6971与给定目标70等距,但代码返回(40, 69),因为它发现首先。在

相关问题 更多 >