Đâ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à increasing
hoặc decreasing
) và strict
ness. 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-through
và short-circuit
cá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.