यहां एक ऐसा संस्करण है जो भौतिक और गैर-भौतिक दोनों अनुक्रमों को स्वीकार करता है । यह स्वचालित रूप से निर्धारित करता है कि क्या है या नहीं monotonic, और यदि ऐसा है, तो इसकी दिशा (यानी increasingया decreasing) और strictनेस। पाठक को मदद करने के लिए इनलाइन टिप्पणियाँ प्रदान की जाती हैं। इसी तरह अंत में प्रदान किए गए परीक्षण-मामलों के लिए।
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)
मैं इस अधिक हो सकता है लगता है Pythonic, लेकिन यह मुश्किल है क्योंकि यह मध्यवर्ती संग्रह (जैसे बनाने से बचा जाता है list, genexpsआदि); विभिन्न मामलों के माध्यम से फ़िल्टर करने के लिए एक एप्रोच fall/trickle-throughऔर short-circuitएप्रोच नियोजित करता है : जैसे एज-सीक्वेंस (जैसे खाली या एक-आइटम सीक्वेंस; या सभी समान वस्तुओं के साथ अनुक्रम); एकरसता, सख्ती और इसी तरह बढ़ती या घटती पहचान। मुझे उम्मीद है यह मदद करेगा।