我有一个只包含两个符号的 python 列表,假设它们是 a
和 b
,列表如下所示:
l = ['a','b','a','b','a','b','a','b','a','b','a','b','a','b','a','b']
现在在我的应用程序中,我有数千个这样的列表,它们的长度各不相同(通常有几百长)。但它们的共同点是它们具有重复模式 (a,b)
。例如,此列表已损坏:
l_broken = ['a','b','b','a','a','b','a','b','a','a','a','b','a','b','b','a']
任何偏离 l
中的 a,b
重复模式的东西都必须被认为是损坏的。即使列表的长度不均匀,它也会被破坏。所以这一定是一个非常严格的测试。但本质上,如果列表 l
的长度为 N
那么这意味着 (a,b)
必须重复 N/2
次。符号 a
和 b
是唯一会出现在这些列表中的东西,所以不需要检查它,因为它在这个应用程序中是不可想象的,因为任何其他东西都可以被看见。
我应该说它们都应该有第一个模式。我正在寻找一种有效的方法,一种测试,它可以确定每个列表实际上都具有这种重复模式。如果没有抛出错误或类似的东西
assert my_fancy_test(l), 'the list does not follow the correct pattern'
我想我正在寻找子序列匹配,但我的谷歌搜索结果不足。
编辑:
感谢大家提供出色的解决方案。我不知道你甚至可以做其中的一半。好东西。我在最后添加了一个简短的性能概述供您细读。
最佳答案
性能
测试列表:l = ['a','b']*100000
RomanPerekhrest的解决方案:
CPU times: user 636 µs, sys: 0 ns, total: 636 µs
Wall time: 639 µs
GZ0的回答:
CPU times: user 14.6 ms, sys: 78 µs, total: 14.7 ms
Wall time: 13.9 ms
Silveris ' 回答:
CPU times: user 95.2 ms, sys: 3.95 ms, total: 99.1 ms
Wall time: 98 ms
h4z3的回答:
CPU times: user 39.9 ms, sys: 0 ns, total: 39.9 ms
Wall time: 38.6 ms
tituszban的回答:
CPU times: user 2.71 ms, sys: 46 µs, total: 2.76 ms
Wall time: 2.76 ms
ruso_ro1回答:
CPU times: user 32.4 ms, sys: 3.35 ms, total: 35.8 ms
Wall time: 34.7 ms
CPU times: user 11.7 ms, sys: 0 ns, total: 11.7 ms
Wall time: 12.1 ms
关于python - 检查 python 列表是否遵循特定的重复模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58116546/