簡體   English   中英

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

[英]How to find specific pattern in a Python list?

我有一個僅包含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”匹配的 position,如該問題的已接受答案中所述。

該問題類似於查找總和為 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM