我有一个只包含True
和False
值的列表。我正在寻找一种模式,当列表的元素从True
更改为False
或反之亦然超过 3 次时。
示例(T 用于True
,F 用于False
用于缩写(:
List = [T, T, T, F, F, F, T, F, T, F, T, T, T, T]
我想检测的是:[F, T, F, T, F, T]
及其在原始列表中的起始索引。
请注意,模式不是固定的。可能是[F, T, F, T, F, T]
或[T, F, T, F, T]
。
如果您有任何有效完成此任务的想法,请告诉我。
如果事实如此,我需要实时完成此检测。我的意思是,List
是通过从另一个来源获取数据(时间戳为 0.5 秒(进行的。我需要在List
中检测上述模式. 您知道如何解决此问题(无论是否实时(,请告诉我。
好吧,您可以将每个列表制作成一个字符串:
newlist=['T' if x is True else 'F' for x in mylist]
newstring=''.join(newlist)
然后找到与"FTFTFT"匹配的位置,如此问题的已接受答案中所述。
该问题类似于查找总和为 0 的最大长度的子数组,并且可以以类似的方式处理:
T = True
F = False
List = [T, T, T, F, F, F, T, F, T, F, T, T, T, T]
def max_toggle_subarray(arr):
start = 0
max_len = 0
for indexI, i in enumerate(arr):
length = 0
for indexJ, j in enumerate(arr[indexI:-1]):
curr = j
length += 1
predict = False if curr else True # Toggle and predict next
if predict == arr[indexI + indexJ + 1]:
if length >= max_len:
max_len = length
if indexJ == 0: start = max(start, indexI + indexJ) # We dont update start index on every iteration
end = indexI + indexJ + 1
else:
break
return start, end
# test array
print("Length of the longest subarray is starting at % d until % d" % max_toggle_subarray(List))
可以使用类似于- 查找最大总和连续子数组的方法将时间复杂度降低到 O(n(