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

时间:2016-07-19 15:44:47

标签: python list sequence repeat sublist

我有一个很大的子列表(大约16000),我想找到重复模式开始和结束的地方。我不是100%确定有重复,但由于子列表序列中出现的对角线,我有充分的理由相信这一点。首选子列表的结构是首选,因为它以这种方式用于此脚本中的其他内容。数据如下所示:

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

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

1 个答案:

答案 0 :(得分:2)

这是一些相当简单的代码,用于扫描字符串以查找相邻的重复子序列。将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

<强>输出

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

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