[英]Remove repeated sequence of integers from list in Python
我有一個整數列表,我需要刪除重復的序列,邏輯正在我的頭腦中。
我一直在試圖修改此我所需要的,但是,只有返回屬於重復序列的長度一個號碼,它只能從開始計數的整數。
到目前為止,這是我所得到的:
def findRep(rmRepList):
#Array to hold [starting position, length] of repeating sequences
repList = []
#For each industry listed
for industry in rmRepList:
#Maximum starting position
maxStartPos = len(industry)-2
#For each possible starting point of repetition
for start in range(1,maxStartPos):
#Limit on how long the repetition can be
maxLen = math.ceil((len(industry)-start)/2)
#For each possible length (2 because already canceled out repeating resources in genAllLoop)
for i in range(2,maxLen):
#If the next 'i' integers repeat
if industry[start:i+start] is industry[i+start:2*i+start]:
repList = [start,i]
industry = rmRep(repList, industry)
#If reached end of list
if 2*i+start+1 == len(industry):
#End loop
break
def rmRep(rmProp, loop):
#Sequence of resources to drop
rmSeq = [loop[rmProp[0]:rmProp[0]+rmProp[1]]]
#Debugging statement
print(rmSeq)
loop.remove(rmSeq)
return(loop)name = username_entry.get()
rmRepList是一個列表列表,包含我需要分析的每個列表。
例如,如果給出一個列表
rmRepList = [[0,1,2,1,2,1,0],[0,1,2,1,2,1,2,3,4,5,3,4,5,6,0]]
我需要它返回[[0,1,2,1,0], [0,1,2,3,4,5,6,0]]
現在,代碼甚至沒有到達rmRep子例程。 我有一種可怕的感覺,我說這一切都錯了。 我不喜歡我在代碼中需要這么多循環,特別是因為我必須分析的實際列表長達數百個數字。 有更簡單的方法嗎?
編輯:如果它有幫助,我可以保證列表不會反復重復一個整數(例如[0,0,0,1,0]
不會發生)。
此外,列表中的第一個和最后一個數字將始終相同。
部分答案:檢測重復的序列。
listA = [0,1,2,1,2,1,2,3,4,5,3,4,5,6,0]
listB = [0,1,2,1,2,1,0]
def get_repeated_seq(seq, start, length):
ref = seq[start:start+length]
#print("Ref", ref)
for pos in range(start+length, len(seq)-length):
compare = seq[pos:pos+length]
#print("Pos", pos, compare)
if compare == ref:
print("Found", ref, "at", pos)
return pos
return False
def get_repeated_seqs(seq):
for size in reversed(range(2, len(seq)/2)):
for pos in range(0, len(seq)-size):
print("Check rep starting at pos %s for size %s" % (pos, size))
get_repeated_seq(seq, pos, size)
print(get_repeated_seqs(listA))
然后你可以根據你的刪除策略刪除它們(bigsts?smallests?)
編輯 :要明確它的工作原理(並在同一時間添加一些刪除)
listA = [0,1,2,1,2,1,2,3,4,5,2,1,3,4,5,2,1,6,0]
listB = [0,1,2,1,2,1,0]
def get_repeated_seq(seq, start, length):
ref = seq[start:start+length]
#print("Ref", ref)
for pos in range(start+length, len(seq)-length):
compare = seq[pos:pos+length]
#print("Pos", pos, compare)
if compare == ref:
#print("Found", ref, "at", pos)
return pos, length
return False
def get_repeated_seqs(seq):
reps = []
for size in reversed(range(2, len(seq)/2)):
for pos in range(0, len(seq)-size):
#print("Check rep starting at pos %s for size %s" % (pos, size))
rep = get_repeated_seq(seq, pos, size)
if rep:
reps.append(rep)
return reps
def remove_repeated_seqs(seq, reps):
# need to backup seq ?
for rep in reps:
overlaps = False
for pos in range(rep[0], rep[0]+rep[1]):
if seq[pos] == "*":
overlaps = True
if not overlaps:
for pos in range(rep[0], rep[0]+rep[1]):
seq[pos] = "*"
out = []
for item in seq:
if item != "*":
out.append(item)
return out
reps = get_repeated_seqs(listB)
rem = remove_repeated_seqs(listB, reps)
#print(rem)
print(rem==[0,1,2,1,0])
reps = get_repeated_seqs(listA)
rem = remove_repeated_seqs(listA, reps)
#print(rem)
print(rem==[0,1,2,3,4,5,6,0])
輸出真實和真實:)
EDIT2:沒有-1到達范圍循環中列表的末尾..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.