如何在 Python 列表中找到特定的模式?



我有一个只包含TrueFalse值的列表。我正在寻找一种模式,当列表的元素从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(

最新更新