Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python列表中查找最近的值对_Python_List_Dictionary - Fatal编程技术网

在python列表中查找最近的值对

在python列表中查找最近的值对,python,list,dictionary,Python,List,Dictionary,我有一本这样的字典: d = {'ID_1':[(10, 20), (40, 60), (125, 200)], 'ID_2': [(75, 100), (250, 300)]} 以及位置和ID: pos = 70 IDed = ID_1 output = (40, 60) pos = 90 IDed = ID_2 expected output = (75, 100) pos = 39 IDed = ID_1 expected output = (40, 60) 我想在列表中找到最接近

我有一本这样的字典:

d = {'ID_1':[(10, 20), (40, 60), (125, 200)], 'ID_2': [(75, 100), (250, 300)]}
以及位置和ID:

pos = 70
IDed = ID_1
output = (40, 60)

pos = 90
IDed = ID_2
expected output = (75, 100)

pos = 39
IDed = ID_1
expected output = (40, 60)
我想在列表中找到最接近测试
pos
的值对

我在下面尝试过:

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

这不起作用,因为它不是一个具有单个值的列表。有没有其他方法可以使用类似的方法来实现这一点。如果没有,我可以通过索引列表和计算每个值对之间的距离来找到解决问题的方法。然而,我认为这不是很有效

你真的很接近。贝娄是一个有效的解决方案

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
,其中
x
是整个元组(例如,(40,60)),而
pos
是整数目标值


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

def find_nearest(point_dict, id, stigma):
    try:
        return min(point_dict[id], key=lambda x: min(abs(w - stigma) for w in x))
    except:
        return None

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

请注意,在诸如
d={'ID_1':[(10,20)、(40,69)、(71,200)],…}等情况下,术语在初始词典中嵌套的列表中出现的顺序很重要。术语
69
71
与给定目标的距离相等
70
,但代码返回
(40,69)
,因为它发现首先

您非常接近。贝娄是一个有效的解决方案

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
,其中
x
是整个元组(例如,(40,60)),而
pos
是整数目标值


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

def find_nearest(point_dict, id, stigma):
    try:
        return min(point_dict[id], key=lambda x: min(abs(w - stigma) for w in x))
    except:
        return None

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

请注意,在诸如
d={'ID_1':[(10,20)、(40,69)、(71,200)],…}等情况下,术语在初始词典中嵌套的列表中出现的顺序很重要。术语
69
71
与给定目标的距离相等
70
,但代码返回
(40,69)
,因为它首先发现

我想你想找到与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)]
位置=70
最近的=(0,0)
IDed=“ID\u 1”
对于i/d.items():
如果IDed==i[0]:
对于i[1]中的x:
平均值=(x[0]+x[1])/2
平均最近=(最近[0]+最近[1])/2
如果abs(平均位置)
我认为您希望找到与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)]
位置=70
最近的=(0,0)
IDed=“ID\u 1”
对于i/d.items():
如果IDed==i[0]:
对于i[1]中的x:
平均值=(x[0]+x[1])/2
平均最近=(最近[0]+最近[1])/2
如果abs(平均位置)
您必须更具体地说明什么是最接近的。在
(69100000000)
?@Ev.Kounis是的,这将被认为是最接近的。我将添加更多的示例。如果有一对
(60,69)
和另一对
(50,90)
?这些是笛卡尔坐标吗?像这样绘制两个值对不会出现在列表中,因为它们重叠。单个列表中的值永远不会重叠,您必须更具体地说明最接近的是什么。在
(69100000000)
?@Ev.Kounis是的,这将被认为是最接近的。我将添加更多的示例。如果有一对
(60,69)
和另一对
(50,90)
?这些是笛卡尔坐标吗?像这样绘制两个值对不会出现在列表中,因为它们重叠。单个列表中的值永远不会重叠,这一点非常有效。非常感谢。我觉得一定有一个更简单的方法来做这件事。这个方法非常有效。非常感谢。我觉得一定有一种更简单的方法可以做到这一点。这不是OP想要的(基于前两条评论),这不是OP想要的(基于前两条评论)