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

时间:2017-12-13 10:44:50

标签: python

我想执行以下操作:

<UserControl.Template>
    <ControlTemplate TargetType="UserControl">
        <Grid>
            <Path Fill="{TemplateBinding Background}"
                  Stroke="{TemplateBinding BorderBrush}"
                  StrokeLineJoin="Round"
                  StrokeThickness="{Binding OutlineThickness, RelativeSource={RelativeSource TemplatedParent}}"
                  Data="{Binding Outline, RelativeSource={RelativeSource TemplatedParent}}"/>

            <ContentPresenter
                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Grid>
    </ControlTemplate>
</UserControl.Template>

x / y /它们都可以是None。 如果我以这种方式过滤None值:

min_xy=min(x,y)

如果x&amp; y都是None,我可能会得到这个断言。

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

如果只有其中一个是None,那么有一个优雅的方法来获取小数字,如果它们都是None,那么得到None吗?

5 个答案:

答案 0 :(得分:2)

你可以这样做:

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

修改

自Python 3.4以来,min已更新为接受默认参数,以防提供的iterable为空。这样可以实现优雅的单行:

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

    默认参数指定在提供的iterable为空时返回的对象。如果iterable为空并且未提供default,则会引发ValueError。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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)

答案 3 :(得分:0)

def get_min(arr):
    mini = None
    for ar in arr:
        if ar is not None:
            mini = ar
            mini = min(ar,mini)
    return mini

它将参数作为任意数量元素的列表并返回最小值。我认为这应该有用。

答案 4 :(得分:0)

另一种选择:

def nmin(*args):
    try:
        return min(x for x in args if x is not None)
    except ValueError:
        return None