Python 在大列表中查找重复子列表

Python 在大列表中查找重复子列表,python,list,sequence,repeat,sublist,Python,List,Sequence,Repeat,Sublist,我有一个很大的子列表,大约16000个,我想找到重复模式的开始和结束位置。我不是100%确定是否有重复,但是我有很强的理由相信有重复,因为子列表序列中出现了对角线。子列表的结构是首选的,因为在这个脚本中,它是以这种方式用于其他事情的。数据如下所示: data = ['1100100100000010', '1001001000000110', '0010010000001100', '0100100000011011', etc 我没有任何时间限

我有一个很大的子列表,大约16000个,我想找到重复模式的开始和结束位置。我不是100%确定是否有重复,但是我有很强的理由相信有重复,因为子列表序列中出现了对角线。子列表的结构是首选的,因为在这个脚本中,它是以这种方式用于其他事情的。数据如下所示:

data = ['1100100100000010',
        '1001001000000110',
        '0010010000001100',
        '0100100000011011', etc

我没有任何时间限制,但是最快的方法不会被反对。代码应该能够返回列表中的开始/结束序列和位置,以便将来调用。若有更有用的数据安排,我可以在必要时尝试重新格式化。Python是我在过去几个月里一直在学习的东西,所以我还不能从头开始创建自己的算法。谢谢大家!

下面是一些相当简单的代码,用于扫描字符串以查找相邻的重复子序列。将minrun设置为要检查的最小子序列的长度。对于每个匹配,代码打印第一个子序列的起始索引、子序列的长度以及子序列本身

data = [
    '1100100100000010',
    '1001001000000110',
    '0010010000001100',
    '0100100000011011',
]
data = ''.join(data)

minrun = 3
lendata = len(data)
for runlen in range(minrun, lendata // 2):
    i = 0
    while i < lendata - runlen * 2:
        s1 = data[i:i + runlen]
        s2 = data[i + runlen:i + runlen * 2]
        if s1 == s2:
            print(i, runlen, s1)
            i += runlen 
        else:
            i += 1

注意,我们在索引15和18=15+3:010处得到相同的长度3序列;这表示有3个相邻的010副本。同样,在长度为15的索引17中有3个相邻的拷贝。

你可以使用SET而不是列表吗?你可以考虑看后缀树,或者把你的问题改成重复的子串,因为你可能会发现更多的结果。“AliSAIDOMAR,据我所知,如果你使用SET,一个角色只能出现一次。因为整个列表只有0或1,这是有问题的。@jedwards我在发布之前查看了后缀树以及重复的子字符串方法。我所看到的方法的主要问题是,您必须知道要查找的序列。就我而言,我不知道那是什么。我能想到的唯一方法是在一个for循环中设置它,尝试每一个,但是我觉得可能有更好的方法。你的问题有点不清楚。在本文中,您讨论的是子列表列表,但示例数据是字符串列表,没有子列表。我想你实际上想把字符串列表看作是一个单独的巨字符串,你想知道它是否包含一个大的子串,这些子串精确地重复,在重复的部分之间没有中间位。对吗?
1 3 100
4 3 100
8 3 000
15 3 010
18 3 010
23 3 000
32 3 001
38 3 000
47 3 001
53 3 000
17 15 001001000000110
32 15 001001000000110