[英]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 模式的方法。
忽略“無重疊”要求,這是我使用的代碼:
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.