具有潜在缺失值的多重不等式(a<b<c…)

2024-03-28 10:53:53 发布

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

我想同时测试多个不等式,即

if (a < b < c < ...)

当所有值都存在时,这是很好的。然而,有时要比较的一个或多个变量的数值可能丢失/未知;在我的上下文中,正确的行为是假设相关的不等式得到满足。假设我在值未知时分配了特殊值None:我希望<运算符(或其他方法)的行为是:

^{pr2}$

所以我想得到True如果一个变量真的比另一个小,或者一个变量缺失(取任何特定的预先决定的非数值),或者两个变量都缺失,我希望能够一次将比较串起来,即a < b < c < ...
我还想用<=和{}来做这个。
谢谢


Tags: 方法nonetrueif运算符数值pr2
3条回答

这看起来像是您实际上在尝试测试您的值是否是唯一的,并且是按排序顺序排列的,这些值可以替换为以下内容:

>>> def my_test(l):
>>>     filt_l = [v for v in l if not v is None]
>>>     return (sorted(filt_l) == filt_l) and (len(filt_l) == len(set(filt_l)))

>>> my_test([1,2,3])
True 
>>> my_test([1,None,3])
True 
>>> my_test([1,4,3])
False
>>> my_test([1,1,3])
False

编辑:包括计时,sebdelsol建议的功能似乎更快

^{pr2}$

您可以创建自己的类型重载比较方法(在这个问题中:python overloading operators

例如

class N(object):
    def __init__(self, value):
        self.value = value

    def __lt__(self, other):
        return (self.value is None or self.value < other.value)
    ...


a = N(1); b = N(None); c = N(3)
print a < b < c

您想测试序列(不包括未定义的值)是否按升序排列:

import operator

def isAscending(strictly, *seq):
    cmp_op = operator.lt if stricly else operator.le 
    seq = [e for e in seq if e is not None]
    return all(cmp_op(a, b) for a, b in zip(seq, seq[1:]))

a, b, c = 1, None, 2
print isAscending(True, a, b, c) # strictly ascending ?

为拼写编辑,并按建议使用比较运算符。在

相关问题 更多 >