在列表中查找模式

时间:2011-07-11 20:44:24

标签: python

我正在尝试编写一个python脚本来查找列表中的模式。

EG。鉴于此清单

[1,2,3,4,5,6,4,5,6,4,5,6,4,5,6]

脚本将确定4,5,6次出现3次然后打印出来

3(4,5,6)

我希望是否有人在算法上有任何见解(我只能想到n ^ 2算法,其中我检查大小为1的模式,然后是2,然后是3,等等每次迭代字符串)或者是否可能存在任何可能有助于做同样事情的Python内置库。谢谢!

3 个答案:

答案 0 :(得分:1)

您要查找的算法是Run Length Encoding。该算法的基本原理将为您提供如何处理序列中的模式并对其进行计数。

  

行程编码(RLE)是一种非常简单的数据压缩形式   哪些数据运行(即,相同数据值的序列   发生在许多连续数据元素中)存储为单个数据   价值和数量,而不是原始运行。

以下是关于how to write an RLE program in Python的相关文章。

答案 1 :(得分:1)

在我的头顶,我会这样做:

  1. 从列表A和B的两个副本开始。
  2. 弹出B
  3. 的第一个值
  4. 从A中减去B:C = A-B
  5. 在C中搜索0的区域;这些表示重复的字符串
  6. 将重复的字符串添加到一个字典中,该字典跟踪每个字符串及其被查看的次数
  7. 重复步骤2-5直到B为空。

答案 2 :(得分:1)

这是一个为模式匹配问题提供解决方案的函数:

import itertools

def pattern_match(pattern, sequence):
    """Count the number of times that pattern occurs in the sequence."""
    pattern = tuple(pattern)
    k = len(pattern)

    # create k iterators for the sequence
    i = itertools.tee(sequence, k)

    # advance the iterators
    for j in range(k):
        for _ in range(j):
            next(i[j])

    count = 0
    for q in zip(*i):
        if pattern == q:
            count += 1

    return count

要解决上述问题,请致电:

p = [4, 5, 6]
l = [1, 2, 3, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]
count = pattern_match(p, l)

这是一个完整的code solving the example problem的要点。

(我认为正确答案是该模式重复4次,而不是3次,如问题中所述。)

我不确定这个算法的复杂性是否实际上小于O(n ^ 2)。