Đây là một biến thể chấp nhận cả trình tự hiện thực hóa và không hiện thực hóa . Nó tự động xác định xem nó có hay không monotonic, và nếu có, hướng của nó (tức là increasinghoặc decreasing) và strictness. Nhận xét nội tuyến được cung cấp để giúp người đọc. Tương tự như vậy đối với các trường hợp thử nghiệm được cung cấp ở cuối.
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)
Tôi cho rằng điều này có thể có nhiều Pythonic, nhưng đó là khó khăn bởi vì nó tránh được việc tạo ra bộ sưu tập trung (ví dụ list, genexps, vv); cũng như sử dụng phương pháp fall/trickle-throughvà short-circuitcách tiếp cận để lọc qua các trường hợp khác nhau: Ví dụ: Trình tự cạnh (như trình tự trống hoặc một mục; hoặc chuỗi có tất cả các mục giống nhau); Xác định tính đơn điệu tăng hoặc giảm, tính chặt chẽ, v.v. Tôi hy vọng nó sẽ giúp.