我有这样的字典:
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)
因为它首先找到了那个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句