Hier ist eine Variante, die sowohl materialisierte als auch nicht materialisierte Sequenzen akzeptiert . Es bestimmt automatisch, ob es sich um monotonic
eine Richtung (dh increasing
oder decreasing
) und eine strict
Ness handelt. Inline-Kommentare helfen dem Leser. Ähnliches gilt für Testfälle, die am Ende bereitgestellt werden.
def isMonotonic(seq):
"""
seq.............: - A Python sequence, materialized or not.
Returns.........:
(True,0,True): - Mono Const, Strict: Seq empty or 1-item.
(True,0,False): - Mono Const, Not-Strict: All 2+ Seq items same.
(True,+1,True): - Mono Incr, Strict.
(True,+1,False): - Mono Incr, Not-Strict.
(True,-1,True): - Mono Decr, Strict.
(True,-1,False): - Mono Decr, Not-Strict.
(False,None,None) - Not Monotonic.
"""
items = iter(seq)
prev_value = next(items, None)
if prev_value == None: return (True,0,True)
isSequenceExhausted = True
curr_value = prev_value
for item in items:
isSequenceExhausted = False
if item == prev_value: continue
curr_value = item
break
else:
return (True,0,True) if isSequenceExhausted else (True,0,False)
strict = True
if curr_value > prev_value:
for item in items:
if item < curr_value: return (False,None,None)
if item == curr_value: strict = False
curr_value = item
return (True,+1,strict)
else:
for item in items:
if item > curr_value: return (False,None,None)
if item == curr_value: strict = False
curr_value = item
return (True,-1,strict)
assert isMonotonic([1,2,3,4]) == (True,+1,True)
assert isMonotonic([4,3,2,1]) == (True,-1,True)
assert isMonotonic([-1,-2,-3,-4]) == (True,-1,True)
assert isMonotonic([]) == (True,0,True)
assert isMonotonic([20]) == (True,0,True)
assert isMonotonic([-20]) == (True,0,True)
assert isMonotonic([1,1]) == (True,0,False)
assert isMonotonic([1,-1]) == (True,-1,True)
assert isMonotonic([1,-1,-1]) == (True,-1,False)
assert isMonotonic([1,3,3]) == (True,+1,False)
assert isMonotonic([1,2,1]) == (False,None,None)
assert isMonotonic([0,0,0,0]) == (True,0,False)
Ich nehme an, dies könnte mehr sein Pythonic
, aber es ist schwierig , weil es Zwischen Sammlungen vermeidet die Erstellung (zB list
, genexps
usw.); sowie verwendet einen fall/trickle-through
und short-circuit
Ansatz, um durch die verschiedenen Fälle zu filtern: zB Kantensequenzen (wie leere Sequenzen oder Sequenzen mit einem Element; oder Sequenzen mit allen identischen Elementen); Identifizieren zunehmender oder abnehmender Monotonie, Strenge und so weiter. Ich hoffe, es hilft.