在python列表中找到最接近的值对

时间:2016-07-18 13:02:08

标签: python list dictionary

我有一本字典:

.
├── _config.yml
├── css
│   ├── main.css
│   └── main.scss
├── _images
├── img
├── index.html
└── _sass
    ├── _base.scss
    ├── _layout.scss
    ├── _syntax-highlighting.scss
    └── _theme.scss

以及职位和ID:

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

我想在列表中找到最接近测试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

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

2 个答案:

答案 0 :(得分:4)

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

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)], ...}之类的情况下,术语在嵌套在初始字典中的列表中出现的顺序非常重要。条款6971与指定的目标70等距,但代码返回(40, 69),因为它发现第一个

答案 1 :(得分:0)

我认为你想找到与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