如何用一行min()代码获取一个数组中不存在于另一个数组的最小值
问题描述
现有如下两组数组:
nearest_distance_table = [1,4,5,9,10,14,15] nodes_explored = [2,10,14]
需要将变量next赋值为nearest_distance_table中不存在于nodes_explored的最小值,我已通过如下for循环实现对应逻辑:
minimum = float("inf") for I in nearest_distance_table: if I < minimum and I not in nodes_explored: minimum = I print(I)
请问是否可以借助min()函数用一行代码实现该需求?
解答
完全可以实现,具体写法如下:
next = min(num for num in nearest_distance_table if num not in nodes_explored)
小提示:
next是Python内置函数名,实际开发中不建议用它作为变量名,避免命名冲突。
效率优化建议
如果nodes_explored数据量较大,建议先转换为集合再做存在性判断:集合的in操作时间复杂度为O(1),远高于列表的O(n),数据量越大优化效果越明显。
可以单独声明集合变量,也可以直接内联到一行代码中:
# 单独声明集合 explored_set = set(nodes_explored) next = min(num for num in nearest_distance_table if num not in explored_set) # 内联写法,整行完成赋值 next = min(num for num in nearest_distance_table if num not in set(nodes_explored))
边界情况兼容
如果存在nearest_distance_table所有元素都属于nodes_explored的场景,Python 3.4及以上版本可以给min()添加default参数自定义无符合条件时的返回值,避免抛出ValueError异常:
# 无符合条件元素时返回None next = min((num for num in nearest_distance_table if num not in nodes_explored), default=None)
原有代码问题提示
你原来写的for循环存在逻辑bug:循环结束后打印的是遍历的最后一个元素I,而非存储最小值的minimum,运行你给出的示例数组会输出15而非正确的最小值1,需要注意修正。
内容的提问来源于stack exchange,提问作者Patrick_Chong
相关产品推荐
相关产品推荐

