如何在排序列表中找到条件最近值

假设我们有以下代码:


val_list = [1000,2000,2500,3200,4000,4200,4800,4900,5000,5001,5002,5003]

val_dict = {"a":1000,"b":2000,"c":2500,"d":3200,"e":4000,"f":4200,"g":4800,"h":4900,"i":5000,"j":5001,"k":5002,"l":5003}


sig_letters = ["a","b","d","f","h","i","k","l"]

本质上,我们有一些值的排序列表。这些值也是另一个字典的值。


然后关联的键可能(或可能不)在另一个列表中。


假设我对来自的数字“5000”感兴趣,val_list并且我想找到最近的不包括自身的重要字母。


我不知道如何实现查找最近的重要字母。因为在这种情况下,最近的有效字母实际上"k": 5002是距离 2 个索引位置"i":5000。


"h":4900不是一个可接受的答案,因为 |4900-5000| 之间的绝对差异 = 100 而 |5002-5000| = 2。


在程序测试 4900 更接近之前,我无法弄清楚如何获得一些东西来测试 5002 是否更接近 5000。由于 5002 和 4900 的密钥都在 中sig_letters,因此应首先测试 5002 以打破循环。


元芳怎么了
浏览 166回答 2
2回答

炎炎设计

您可以将 dict 过滤为仅包含在sig_letters且值不等于查询值的条目。使用理解,然后使用minwith aabs作为关键函数来查找感兴趣的字典条目:>>> x=5000 >>> min({k:v for k,v in val_dict.items() if k in sig_letters and v!=x}.items(), key=lambda e: abs(x-e[1])) ('k', 5002)在 Python 3.x 中,.items()是一个动态的字典视图对象。随着基础字典的变化,它是快速和更新的。如果您使用的是 Python 2.7,请使用.viewitems()而不是 items() (并考虑更新到 Python 3.x ...)

四季花海

看起来所有三个集合都已排序(在字典的情况下,'a' 的值总是小于 'b' 的值,依此类推)。这让事情变得非常简单 - 看看字母的两边sig_lettersdef absolute_difference(a: int, b: int) -> int:&nbsp; &nbsp; return a - b if a > b else b - adef nearest(val: int) -> str:&nbsp; &nbsp; global val_list, val_dict, sig_letters&nbsp; &nbsp; exact_key = None&nbsp; &nbsp; # Find the corresponding key in val_dict (catch not found)&nbsp; &nbsp; for key, value in val_dict.items():&nbsp; &nbsp; &nbsp; &nbsp; if value == val:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exact_key = key&nbsp; &nbsp; # Find exact_key's index in sig_letters&nbsp; (catch ValueError)&nbsp; &nbsp; exact_index = sig_letters.index(exact_key)&nbsp; &nbsp; # Get values to left and right (catch out of bounds)&nbsp; &nbsp; left = sig_letters[exact_index-1]&nbsp; &nbsp; right = sig_letters[exact_index+1]&nbsp; &nbsp; left_val = val_dict[left]&nbsp; &nbsp; right_val = val_dict[right]&nbsp; &nbsp; if absolute_difference(left_val, val) < absolute_difference(right_val, value):&nbsp; &nbsp; &nbsp; &nbsp; return left&nbsp; &nbsp; else:&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return right
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python