在python中查找列表中的序列索引

时间:2012-05-05 06:31:14

标签: python list

我很新,我希望它不太明显,但我似乎无法找到以下问题的简短而准确的答案。

我有两个清单:

a = [2,3,5,2,5,6,7,2]
b = [2,5,6]

我想找到第二个列表(b)的所有索引都在第一个列表(a)中,这样我就得到这样的结果:

a的索引:3, 4, 5b = a[3:6]

3 个答案:

答案 0 :(得分:15)

列表理解:

>>> [(i, i+len(b)) for i in range(len(a)) if a[i:i+len(b)] == b]
[(3, 6)]

或者使用for循环:

>>> indexes = []
>>> for i in range(len(a)):
...    if a[i:i+len(b)] == b:
...        indexes.append((i, i+len(b)))
... 
>>> indexes
[(3, 6)]

答案 1 :(得分:0)

此外,为了提高效率,您可以使用在字符串匹配(from here)中使用的KMP算法:

def KMPSearch(pat, txt): 
    M = len(pat) 
    N = len(txt) 

    # create lps[] that will hold the longest prefix suffix  
    # values for pattern 
    lps = [0]*M 
    j = 0 # index for pat[] 

    # Preprocess the pattern (calculate lps[] array) 
    computeLPSArray(pat, M, lps) 

    i = 0 # index for txt[] 
    while i < N: 
        if pat[j] == txt[i]: 
            i += 1
            j += 1

        if j == M: 
            print("Found pattern at index " + str(i-j))
            j = lps[j-1] 

        # mismatch after j matches 
        elif i < N and pat[j] != txt[i]: 
            # Do not match lps[0..lps[j-1]] characters, 
            # they will match anyway 
            if j != 0: 
                j = lps[j-1] 
            else: 
                i += 1

def computeLPSArray(pat, M, lps): 
    len = 0 # length of the previous longest prefix suffix 

    lps[0] # lps[0] is always 0 
    i = 1

    # the loop calculates lps[i] for i = 1 to M-1 
    while i < M: 
        if pat[i]== pat[len]: 
            len += 1
            lps[i] = len
            i += 1
        else: 
            # This is tricky. Consider the example. 
            # AAACAAAA and i = 7. The idea is similar  
            # to search step. 
            if len != 0: 
                len = lps[len-1] 

                # Also, note that we do not increment i here 
            else: 
                lps[i] = 0
                i += 1

a = [2,3,5,2,5,6,7,2]
b = [2,5,6]
KMPSearch(b, a) 

这将在b中找到a的第一个索引。因此,范围是搜索的结果,其范围是b的长度。

答案 2 :(得分:-3)

这应该按照你的要求行事:

a = [2,3,5,2,5,6,7,2]
b = [2,5,6]
for i in range(len(a)):
    if a[i] in b:
        print i

当然你应该根据自己的喜好格式化print语句。或者不打印并将结果保存在另一个列表中。

祝你好运!