Python: min(None, x) 的处理方法

49 投票
11 回答
34055 浏览
提问于 2025-04-16 19:02

我想要做以下事情:

a=max(a,3)
b=min(b,3)

不过有时候,ab 可能会是 None
我很高兴发现,在使用 max 的时候,它能正常工作,给我想要的结果 3,但是如果 bNone,那么 b 还是会保持为 None...

有没有人能想到一个简单的方法,让 min 在其中一个参数是 None 的情况下也能返回数字呢?

11 个回答

7

这是一个针对Python 3的解决方案

代码:

# 变量 lst 是你的序列

min(filter(lambda x: x is not None, lst)) if any(lst) else None

示例:

In [3]: lst = [None, 1, None]

In [4]: min(filter(lambda x: x is not None, lst)) if any(lst) else None
Out[4]: 1

In [5]: lst = [-4, None, 11]

In [6]: min(filter(lambda x: x is not None, lst)) if any(lst) else None
Out[6]: -4

In [7]: lst = [0, 7, -79]

In [8]: min(filter(lambda x: x is not None, lst)) if any(lst) else None
Out[8]: -79

In [9]: lst = [None, None, None]

In [10]: min(filter(lambda x: x is not None, lst)) if any(lst) else None

In [11]: print(min(filter(lambda x: x is not None, lst)) if any(lst) else None)
None

注意事项:

这个代码可以处理包含数字和None的序列。如果所有的值都是None,使用min()会报错

ValueError: min() 的参数是一个空序列

这个代码可以完全解决这个问题

优点:

  1. 即使序列中有None也能正常工作
  2. 在Python 3中可以使用
  3. max() 也可以正常工作

缺点:

  1. 列表中需要有超过一个非零的变量。例如 [0, None] 会失败。
  2. 需要一个变量(比如 lst)或者需要复制序列
10

我在Python 3(3.4及以上版本)中的解决方案:

min((x for x in lst if x is not None), default=None)
max((x for x in lst if x is not None), default=None)
53

你为什么不直接创建一个没有None值的生成器呢?这样更简单、更干净。

>>> l=[None ,3]
>>> min(i for i in l if i is not None)
3

撰写回答