Python: min(None, x) 的处理方法
我想要做以下事情:
a=max(a,3)
b=min(b,3)
不过有时候,a
和 b
可能会是 None
。
我很高兴发现,在使用 max
的时候,它能正常工作,给我想要的结果 3
,但是如果 b
是 None
,那么 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() 的参数是一个空序列
这个代码可以完全解决这个问题
优点:
- 即使序列中有None也能正常工作
- 在Python 3中可以使用
- max() 也可以正常工作
缺点:
- 列表中需要有超过一个非零的变量。例如 [0, None] 会失败。
- 需要一个变量(比如 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