【问题标题】:Find indexes of sequence in list in python在python中的列表中查找序列索引
【发布时间】:2012-05-05 06:31:13
【问题描述】:

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

我有两个列表:

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

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

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

【问题讨论】:

    标签: python list


    【解决方案1】:

    使用列表理解:

    >>> [(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)]
    

    【讨论】:

    • 你的理解范围应该是xrange(len(a)),否则如果它在末尾,它将与seq不匹配。
    • 非常感谢,这个答案和评论的结合真的帮助了我! :)
    • 这似乎好一点:[(i, i+len(b)) for i in range(len(a)-len(b)+1) if a[i:i+len(b)] == b]
    【解决方案2】:

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

    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) 
    

    这会在a 中找到b 的第一个索引。因此,范围是搜索的结果以及它的长度加上b

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-07
      • 2021-06-25
      • 1970-01-01
      • 2021-07-16
      • 2014-10-13
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多