Cho danh sách giá trị, chúng ta muốn biết vị trí nào có giá trị Boolean liên tục. Nghĩa là sau khi gặp TRUE, các giá trị TRUE tiếp theo liên tục cho đến khi gặp FALSE. Tương tự cho FALSE.
Với itertools
Dùng accumulate và groupby từ itertools. Áp dụng accumulate để theo dõi giá trị được gom nhóm bằng sum. Giá trị cuối cùng là vị trí kết thúc.
Ví dụ
from itertools import accumulate, groupby
listA = [False, True, True, False, False]
print("Danh sách cho trước:\n", listA)
res = [0] + list(accumulate(sum(1 for x in y) for x, y in groupby(listA)))
print("Vị trí phạm vi giá trị liên tục:\n", res)
Kết quả
Danh sách cho trước: [False, True, True, False, False] Vị trí phạm vi giá trị liên tục: [0, 1, 3, 5]
Sử dụng enumerate
Dùng enumerate kết hợp zip để liệt kê vị trí bằng cách so sánh mỗi phần tử với phần tử tiếp theo. Nếu không bằng nhau, vị trí mới là điểm bắt đầu phạm vi liên tục.
Ví dụ
listA = [False, True, True, False, False]
print("Danh sách cho trước:\n", listA)
res = [e for e, (x, y) in enumerate(zip([2] + listA, listA + [2])) if x != y]
print("Vị trí phạm vi giá trị liên tục:\n", res)
Kết quả
Danh sách cho trước: [False, True, True, False, False] Vị trí phạm vi giá trị liên tục: [0, 1, 3, 5]