2

一度に複数の不等式をテストしたい、つまり

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

すべての値が存在する場合は問題ありません。ただし、比較する 1 つまたは複数の変数の数値が欠落しているか不明な場合があります。私のコンテキストでの正しい動作は、関連する不等式が満たされていると仮定することです。None値が不明な場合に特別な値を割り当てるとしましょう:<演算子 (または代替) に必要な動作は次のとおりです。

>>> a = 1; b = 2; c = 3
>>> a < b < c # this works fine, obviously
True 
>>> b = None
>>> a < b < c # would like this to return True
False

したがってTrue、1 つの変数が他の変数よりも本当に小さいかどうか、または 1 つの変数が欠落している (事前に決定された特定の非数値を取る) かどうか、または両方の変数が欠落しているかどうかを取得したいと考えています。まとめて比較します。つまり、と同様a < b < c < ...
にこれも実行したいと思います。 ありがとう<=<

4

6 に答える 6

5

シーケンス (未定義の値を除く) が昇順であるかどうかをテストします。

import operator

def isAscending(strictly, *seq):
    cmp_op = operator.lt if strictly 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 ?

スペルを編集し、提案どおりに比較演算子を使用します。

于 2014-09-04T13:42:43.543 に答える
2

これは、値が一意であり、並べ替えられた順序であるかどうかを実際にテストしようとしているように見えます。これは、次のようなものに置き換えることができます。

>>> 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によって提案された機能はさらに高速であるようです

>>> %timeit isAscending([int(1000*random.random()) for i in xrange(10000)])
100 loops, best of 3: 3.44 ms per loop

>>> %timeit my_test([int(1000*random.random()) for i in xrange(10000)])
100 loops, best of 3: 5.67 ms per loop
于 2014-09-04T12:35:45.967 に答える
1

リスト ( [a, b, c]) に値がある場合は、そこから None 値をフィルタリングし、 を使用してそれらをペアにしzip()、演算子をすべてのペアに適用して、すべてが保持されるかどうかを確認できます。

コード内:

import operator  # For operator.lt, which is < ("less than")

def mass_comparify(op, *args):
    return all(op(a, b) for a, b in zip(args, args[1:])
               if a is not None and b is not None)

print(mass_comparify(operator.lt, 1, None, 3))  # Prints True because 1 < 3
于 2014-09-04T13:57:27.230 に答える
0

必要に応じて比較を行う比較関数を定義し、不等式を次のように記述するよりも良いオプションはないと思います

comp(a,b) and comp(b,c) and ...
于 2014-09-04T12:46:33.627 に答える
0

完全に適合するかどうかはわかりませんが、使用できますreduce

>>> import operator
>>> reduce(operator.__lt__, [1, None, 3])
True
>>> reduce(operator.__lt__, [1, None, 0])
False

または、 None 値を明示的に無視するため、はるかに確実です。

>>> import operator
>>> reduce(operator.__lt__, filter(None, [1, None, 3]))
True
>>> reduce(operator.__lt__, filter(None, [1, None, 0]))
False
于 2014-09-04T15:03:41.930 に答える