代码之家  ›  专栏  ›  技术社区  ›  Ondrej

Python简单的最小/最大值函数,无

  •  0
  • Ondrej  · 技术社区  · 4 年前

    我正在尝试设计一个自定义的min/max函数,该函数将始终过滤掉输入中的每个None,如果除了None之外没有其他值,它也将返回None。 我找到了几个答案,这些答案有助于回答我关于如何创建一个可以处理任何事情的理想函数的问题。与原始的最小/最大函数相同。

    这是我迄今为止创造的:

    def min_null(q, *args):
        if isinstance(q, Iterable):
            return min(filter(lambda x: x is not None, q)) if any(q) else None
        else:
            return min_null([q, *args])
    

    你能看出这会失败吗?或者如何改进?

    我很乐意收到任何反馈:)

    0 回复  |  直到 4 年前
        1
  •  2
  •   xavc    4 年前

    是的,一个失败案例是 min_null([0, 0]) ,返回 None ,而不是我所期望的,即 0 。这可以通过多种方式解决,但其中之一是取出 filter(lambda x: x is not None, q) 然后检查它的长度,而不仅仅是检查任何真实值。

        2
  •  0
  •   Terry Spotts    4 年前

    听起来你可以使用min/max函数 key= 以及一个自定义比较对象,用于处理 None 特别是:

    class Predicate:
        def __init__(self, item):
            self.item = item
    
        def __lt__(self, other):
            try:
                return self.item < other.item
            except TypeError:
                return False
    
    
    print(min([0, 1, 2, None, 3, 4], key=Predicate))
    print(min([None], key=Predicate))
    
    print(max([0, 1, 2, 3, None, 4, 5], key=Predicate))
    print(max([None], key=Predicate))
    

    输出:

    0
    None
    5
    None
    0
    

    你有更多关于预期结果的例子或测试吗?