【发布时间】:2019-09-26 12:11:06
【问题描述】:
我有一个仅包含两个符号的 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 是唯一会出现在这些列表中的东西,因此不需要检查它,因为它在这个应用程序中是不可想象的,其他任何东西都可以看到。
我应该说他们都应该有 first 模式。我正在寻找一种有效的方法,一种测试,它可以确定每个列表实际上确实具有这种重复模式。如果不抛出错误或其他东西,例如
assert my_fancy_test(l), 'the list does not follow the correct pattern'
我想我正在寻找子序列匹配,但我的 google 搜索不足。
编辑:
感谢大家的出色解决方案。我不知道你能做到这些的一半。好东西。我在最后添加了一个简短的性能概述供您仔细阅读。
【问题讨论】:
-
one_list in another_list? -
@OlvinRoght 你可以做
assert [a,b] in L,但我需要知道这种模式实际上在整个列表中重复。 -
@RomanPerekhrest 不确定您的意思,我的列表仅包含两个符号,它们以上述模式重复。
-
实际的符号是字符串吗?还是你只是用它们来代表问题?
-
@tituszban 它们是实际的字符串,但如果这样更容易,我很乐意用其他东西替换。它们只是实际发生的操作的占位符。
标签: python testing pattern-matching