Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中从列表中删除重复的整数序列_Python_List_Sequence - Fatal编程技术网

在Python中从列表中删除重复的整数序列

在Python中从列表中删除重复的整数序列,python,list,sequence,Python,List,Sequence,我有一个整数列表,我需要从中删除重复的序列,逻辑正在做我的头 我一直在尝试修改我需要的,但是它只返回一个与重复序列长度相关的数字,并且它只从起始整数开始计数 这是我目前为止所做的: def findRep(rmRepList): #Array to hold [starting position, length] of repeating sequences repList = [] #For each industry listed for industry i

我有一个整数列表,我需要从中删除重复的序列,逻辑正在做我的头

我一直在尝试修改我需要的,但是它只返回一个与重复序列长度相关的数字,并且它只从起始整数开始计数

这是我目前为止所做的:

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))
然后你可以根据你的移除策略移除它们(最大的?最小的?)

编辑:明确它是否有效(同时添加一些删除)

输出True和True:)


EDIT2:no-1进入for range循环的列表末尾。

你能用简单的英语解释为什么
[0,1,2,1,0]
映射到
[0,1,2,1,0]
?这里应用的规则我不清楚。1,2是重复的(非重叠的)序列,所以它被移除。重复的序列可以是任意长度还是只有一个固定长度?重复的序列会彼此相邻吗?
[0,1,2,3,4,1,2]
可能吗?->您会删除哪一个?^^^任意长度的重复序列^复制品就在旁边。如果删除了列表的一部分,这仍然适用。e、 g.
[0,1,2,3,4,3,4,4,2,3,4,0]
变成
[0,1,2,3,3,4,0]
变成
[0,1,2,3,4,0]
哎呀,太好了!伙计,StackOverflow上的人都是巫师,我整个上午都在看这个,什么都没看到。我要删除所有重复的序列,现在应该不会太难了。检测是一回事,删除是另一回事:)你应该小心重叠删除…对于边缘情况:
[0,1,2,1,2,2,1,1,1,1,2,3,4,5,2,1,3,4,5,2,1,6,0]
是一个令人讨厌的示例。。。(2,1)是(3,4,5,2,1)大序列的一部分,也是(2,1)的重复序列。。。因此,删除策略必须比仅仅“删除重复项”定义得更好。嗯,你提出了一个很好的观点。最初,我想删除的序列是背对背的序列。在您提到的这种情况下,这意味着它将变成
[0,1,2,3,4,5,2,1,6,0]
,也就是说,我刚刚发现,通过我已经设置的,我只需要检测其中包含重复项的列表(通过我第一次创建列表的方式),然后删除它们。只需在
打印中按列表B更改列表A即可(得到重复的序列(列表A))
你会得到('Found',[1,2],'at',3)???
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])