向 lambda 函数添​​加附加逻辑以从 python 字典中获取最小值

Posted

技术标签:

【中文标题】向 lambda 函数添​​加附加逻辑以从 python 字典中获取最小值【英文标题】:Adding additional logic to a lambda function to get the minimum value from a python dictionary 【发布时间】:2022-01-14 19:14:00 【问题描述】:

我有一个字典,其中的值将某个对象映射到一个整数;例如节点:1,节点:2。

我想获取与此字典中最小值对应的键,我知道我可以这样做:

min_key = min(my_dict, key=lambda k: my_dict[k])

但是,我还想添加键不包含在其他集合中的约束。这是我希望工作的伪代码:

min_key = min(my_dict, key=lambda k: my_dict[k] where k not in my_set)

有没有办法在 python 中将它写成单行代码作为 lambda 的一部分,还是我现在必须显式循环遍历字典并像这样在循环中添加逻辑?

min_key, min_value = None, float('inf')
for k,v in my_dict.items():
    if v < min_value and k not in my_set:
        min_key = k
return min_key

【问题讨论】:

那不是一个有效的字典,你不能有重复的键。 一个标准的技巧是返回math.inf 获取最小值时要忽略的值。同样使用-math.inf 来查找最大值。所以你的例子是key=lambda k: math.inf if k in my_set else my_dict[k] 【参考方案1】:

my_dict 替换为返回过滤字典的字典理解。

min_key = min(k:v for k, v in my_dict.items() if k not in my_set, 
                key = lambda k: my_dict[k])

【讨论】:

没有必要用值构建字典,因为min 会忽略它们。 你说得对,我们只需要一个键列表。 既然你发布了这个答案,我就懒得编辑我的了。【参考方案2】:

只需对过滤后的键取最小值,而不是所有键:

min_key = min(my_dict.keys() - my_set, key=my_dict.get)

(注意我也替换了你的key函数,不需要你自己写。)

【讨论】:

【参考方案3】:

类似于@Barmar 的回答,但您也可以在my_dictmy_set 之间使用set.difference 来过滤相关字典:

out = min(set(my_dict).difference(my_set), key = lambda k: my_dict[k])

【讨论】:

min 无论如何都会忽略的值付出额外的努力似乎很浪费。 @KellyBundy 你是对的,这是一个很好的观点。谢谢。

以上是关于向 lambda 函数添​​加附加逻辑以从 python 字典中获取最小值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .yaml 文件向 AWS Lambda 函数添​​加策略?

调用将 lambda 函数加在一起的自定义函数时内核重新启动

将 Lambda 函数添​​加到 AWS AppSync 数据源?

Python3 AWS Lambda-向需要VPN的域发出发布请求

匿名函数(lambda)

通过 Cloudformation 模板将 Lambda 函数添​​加到 Kinesis Firehose