Python min(x,y)在x/y/both的情况下为Non

2024-04-20 05:10:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我将执行以下操作:

min_xy=min(x,y)

x/y/两者可能都不是。 如果我以这种方式过滤None值:

min_xy=min(filter(None,(x,y)))

如果x&y都不是,我可能会得到这个断言。你知道吗

ValueError: min() arg is an empty sequence

有没有一种优雅的方法可以得到一个小数字,如果只有一个是没有的,如果两个都是没有得到?你知道吗


Tags: 方法noneanis方式arg数字断言
3条回答
x, y = None, 1

min_xy = next(filter(lambda __: __ is not None, (x, y)), None) if any(map(lambda __: __ is None, (x, y))) else min(x, y)

print(min_xy)

为了保持可读性,我建议:

def coalescing_min(*args):
    args = [i for i in args if i is not None]
    if args:
        return min(args)
    else:
        return None

你可以这样做:

min_xy = None if all(n is None for n in (x, y)) else min(filter(None,(x,y)))

您还可以将其转换为function

def min_xy(x, y):
    if all(n is None for n in (x, y)):
        return None
    else:
        return min(filter(None,(x,y)))

lambda

min_xy = lambda x, y: None if all(n is None for n in (x, y)) else min(filter(None,(x,y)))

测试:

print(min_xy(1, None))      # 1
print(min_xy(1, 2))         # 1
print(min_xy(None, 1))      # 1
print(min_xy(None, None))   # None

编辑:

自从python3.4以来,min被更新为在iterable为空的情况下接受默认参数。这使得一个优雅的一行:

min_xy = min(filter(None, (x, y)), default=None)
  • documentation

    The default argument specifies an object to return if the provided iterable is empty. If the iterable is empty and default is not provided, a ValueError is raised.

相关问题 更多 >