为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

元芳怎么了 2023-02-07 09:38:07
假设我们有以下代码: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 以打破循环。
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

您可以将 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 ...)


查看完整回答
反对 回复 2023-02-07
?
四季花海

TA贡献1811条经验 获得超5个赞

看起来所有三个集合都已排序(在字典的情况下,'a' 的值总是小于 'b' 的值,依此类推)。这让事情变得非常简单 - 看看字母的两边sig_letters



def absolute_difference(a: int, b: int) -> int:

    return a - b if a > b else b - a


def nearest(val: int) -> str:

    global val_list, val_dict, sig_letters


    exact_key = None


    # Find the corresponding key in val_dict (catch not found)

    for key, value in val_dict.items():

        if value == val:

            exact_key = key


    # Find exact_key's index in sig_letters  (catch ValueError)

    exact_index = sig_letters.index(exact_key)


    # Get values to left and right (catch out of bounds)

    left = sig_letters[exact_index-1]

    right = sig_letters[exact_index+1]

    left_val = val_dict[left]

    right_val = val_dict[right]



    if absolute_difference(left_val, val) < absolute_difference(right_val, value):

        return left

    else: 

        return right


查看完整回答
反对 回复 2023-02-07
  • 2 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号