Python 在列表中查找模式

Python 在列表中查找模式,python,Python,我正在尝试编写一个python脚本来查找列表中的模式 根据这份清单 [1,2,3,4,5,6,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内置库可以帮助完成同样的事情。谢谢 您正在寻找的算法是。该算法的基本原理将告诉您如何检测序列中的模式并对其进行计数 游程编码(RLE)是一种非常简单

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

根据这份清单

[1,2,3,4,5,6,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内置库可以帮助完成同样的事情。谢谢

您正在寻找的算法是。该算法的基本原理将告诉您如何检测序列中的模式并对其进行计数

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


下面是一篇关于的相关文章。

在我脑海中,我会这样做:

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

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

    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)
    
    这里是一个完整的要点

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


    我不确定这个算法的复杂度是否真的小于O(n^2)。

    如果这是一个家庭作业,你应该指出这一点。必须证明n=np对家庭作业来说似乎有点苛刻。很抱歉回复太晚。这不是一个家庭作业回复,这是我在一个项目中遇到的编程问题。也没有什么可以证明的,在我用Python编写之前,我正在尝试使用智能伪代码。这不是O(n^2)为什么?我只想在一个列表中查找模式……对,我能想到的唯一算法是O(n^2)一个。至少一个优雅的O(n^2)算法可以……正确;它是O(n^2)。我认为只有当你能够约束它时(例如,如果你对长距离分隔的重复不感兴趣),算法才会有所改进。我或多或少地采用了这种方法,并提出了一些约束。@hop是的,我以前多次使用RLE技术检测文本字符串中的重复模式,您不需要做压缩部分,但是RLE背后的理论在这里100%适用。纯RLE假设您已经知道运行中的元素,而op特别希望找到这样一个重复组。