如果不是,那么函数的规范名称?“循环”对我来说是有意义的,但这是采取的。
标题中的示例是为了清晰和简洁而编写的。我正在处理的真实案例有很多重复。(例如,我希望 [1, 1, 0, 0, 0, 2, 1] “匹配” [0, 0, 2, 1, 1, 1, 0])
这类事情模糊了我的算法,并用其他无用的重复填充我的代码。
如果不是,那么函数的规范名称?“循环”对我来说是有意义的,但这是采取的。
标题中的示例是为了清晰和简洁而编写的。我正在处理的真实案例有很多重复。(例如,我希望 [1, 1, 0, 0, 0, 2, 1] “匹配” [0, 0, 2, 1, 1, 1, 0])
这类事情模糊了我的算法,并用其他无用的重复填充我的代码。
您可以通过以下方式获取列表的周期:
def cycles(a):
return [ a[i:] + a[:i] for i in range(len(a)) ]
然后,您可以检查 b 是否是 a 的循环:
b in cycles(a)
如果列表的长度很长,或者如果想要对相同的循环进行多次比较,则将结果嵌入到集合中可能是有益的(在性能方面)。
set_cycles = set(cycles(a))
b in set_cycles
您可以通过在列表中嵌入相等性检查并使用任何方法来防止构造所有循环:
any( b == a[i:]+a[:i] for i in range(len(a)))
您也可以通过将cycles
函数转换为生成器来实现此效果。
之前误解了你的问题。如果您想检查列表的任何循环是否与列表l1
匹配l2
,最好(最干净/最 Pythonic)的方法可能是any(l1 == l2[i:] + l2[:i] for i in xrange(len(l2)))
. 还有一种rotate
方法collections.deque
可能对您有用。