我正在尝试编写一个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内置库。谢谢!
答案 0 :(得分:1)
您要查找的算法是Run Length Encoding。该算法的基本原理将为您提供如何处理序列中的模式并对其进行计数。
行程编码(RLE)是一种非常简单的数据压缩形式 哪些数据运行(即,相同数据值的序列 发生在许多连续数据元素中)存储为单个数据 价值和数量,而不是原始运行。
以下是关于how to write an RLE program in Python的相关文章。
答案 1 :(得分:1)
在我的头顶,我会这样做:
答案 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)。