在列表中查找特定的子列表

Bel*_*gor 3 python algorithm list

假设我们有以下列表:

sequence = ['2', '4', '1', '2', '3', '4', '2', '4', '2', '4', '4']
#indices     0    1    2    3    4    5    6    7    8    9    10
Run Code Online (Sandbox Code Playgroud)

接下来,我们有以下列表:

key_list = ['2', '2', '4']
Run Code Online (Sandbox Code Playgroud)

现在,我想提取所有可能的子列表sequence,保留其顺序keylist,即其索引.

让我举例说明.因此,对于sequence保留顺序的所有可能的索引子列表key_list是:

[0, 3, 5]
[0, 3, 7]
[0, 3, 9]
[0, 3, 10]

[0, 6, 7]
[0, 6, 9]
[0, 6, 10]

[0, 8, 9]
[0, 8, 10]

[3, 6, 7]
[3, 6, 9]
[3, 6, 10]

[3, 8, 9]
[3, 8, 10]

[6, 8, 9]
[6, 8, 10]
Run Code Online (Sandbox Code Playgroud)

有什么建议?

编辑:我正在使用一个大数据集,我必须为文件的每一行执行此操作,所以我正在寻找一种非常优化的方法来做到这一点,通过避免蛮力方法(制作所有可能的序列组合)

PS我不知道问题的标题是否合适,如果您有更好的标题,请随时更改.

Ash*_*ary 6

你可以用itertools.combinations它.适用combinations()enumerate(sequence)(与r=len(key_list))来获取列表中的所有R-长度的组合,由于enumerate()回报指数以及项目我们都可以很容易地在这里得到的指标:

>>> from itertools import combinations               
>>> for c in combinations(enumerate(sequence), len(key_list)):
    indices, data = zip(*c)
    if list(data) == key_list:
        print indices
...         
(0, 3, 5)
(0, 3, 7)
(0, 3, 9)
(0, 3, 10)
(0, 6, 7)
(0, 6, 9)
(0, 6, 10)
(0, 8, 9)
(0, 8, 10)
(3, 6, 7)
(3, 6, 9)
(3, 6, 10)
(3, 8, 9)
(3, 8, 10)
(6, 8, 9)
(6, 8, 10)
Run Code Online (Sandbox Code Playgroud)

  • 霍莉莫莉,这令人印象深刻.但我想知道复杂性是多少,如果它不会增长太快,它似乎相当暴力.我想也可以通过构建一个前缀树来解决它,它可能会更好地扩展. (2认同)