簡體   English   中英

在列表中查找模式

[英]Finding patterns in list

我目前正在尋找一種在整數列表中查找模式的方法,但我將要使用的方法當然適用於字符串和其他具有不同元素的列表。 現在讓我解釋一下我在尋找什么。

我想在整數列表中找到最長的重復模式。 例如,

[1, 2, 3, 4, 1, 2, 3]
# This list would give 1, 2, 3

應丟棄重疊模式。 (不確定)

[1, 1, 1, 1, 1]
# Should give 1, 1  Not 1, 1, 1, 1

這是什么對我沒有幫助。

在列表中查找模式(不明白第一個答案背后的邏輯,很少解釋。只有在解決之前知道模式時,第二個答案才能解決問題。)

從列表中查找整數模式(給出了模式並需要出現次數。與我的問題不同。)

最長公共子序列問題(大多數人都處理過這個問題,但它並不接近我的問題。我在搜索模式時需要連續的元素。但是在這個問題中,單獨的元素也算作子序列。)

這是我嘗試過的。

def pattern(seq):
    n = len(seq)
    c = defaultdict(int) # Counts of each subsequence
    for i in xrange(n):
        for j in xrange(i + 1, min(n, n / 2 + i)): 
            # Used n / 2 because I figured if a pattern is being searched
            # It cant be longer that the half of the list.
            c[tuple(seq[i:j])] += 1      
    return c

如您所見,它會查找所有子列表並檢查重復項。 我發現這種方法有點幼稚(而且效率低下),我需要更好的方法。 請幫幫我。 提前致謝。

注1:列表是預先確定的,但由於我的算法失敗,我只能在凍結計算機之前檢查列表的某些部分。 所以我試圖找到的模式很可能比搜索列表的一半長,它甚至可能比搜索列表本身更長,因為我只搜索原始列表的一部分。如果你提出比搜索更好的方法我正在使用,我可以搜索原始列表的更大部分,因此我將有更好的機會找到該模式。 (如果有的話。)

注意2:如果您想自己測試,這里是列表的一部分。 看起來確實存在一種模式,但是在使用可靠的代碼對其進行測試之前,我無法確定。 樣品清單

注3:我將此視為數據挖掘的一個嚴重問題。 如果你做一個很長的解釋,我會嘗試學習。 感覺這是一個比 LCS 重要得多的問題,但是 LCS 更受歡迎 :D 我試圖找到的這種方法感覺就像科學家用來尋找 DNA 模式的方法。

代碼(針對 Python 2 + 3 更新)

忽略“無重疊”要求,這是我使用的代碼:

import collections
  
def pattern(seq):
        storage = {}
        for length in range(1,int(len(seq)/2)+1):
                valid_strings = {}
                for start in range(0,len(seq)-length+1):
                        valid_strings[start] = tuple(seq[start:start+length])
                candidates = set(valid_strings.values())
                if len(candidates) != len(valid_strings):
                        print("Pattern found for " + str(length))
                        storage = valid_strings
                else:
                        print("No pattern found for " + str(length))
                        break
        return set(v for v in storage.values() if list(storage.values()).count(v) > 1)

使用它,我在您的數據集中發現了 8 個長度為 303 的不同模式。 程序運行得也很快。

偽代碼版本

define patterns(sequence):
    list_of_substrings = {}
    for each valid length:  ### i.e. lengths from 1 to half the list's length
        generate a dictionary my_dict of all sub-lists of size length
        if there are repeats:
            list_of_substrings = my_dict
        else:
            return all repeated values in list_of_substrings
    return list_of_substrings  #### returns {} when there are no patterns

我有一個答案。 它有效。 (沒有重疊)但它適用於python3

      def get_pattern(seq):
        seq2=seq
        outs={}
        l=0
        r=0
        c=None
        for end in range(len(seq2)+1):
          for start in range(end):
            word=chr(1).join(seq2[start:end])
            if not word in outs:
              outs[word]=1
            else:
              outs[word]+=1
        for item in outs:
          if outs[item]>r or (len(item)>l and outs[item]>1):
            l=len(item)
            r=outs[item]
            c=item
        return c.split(chr(1))

暫無
暫無

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

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