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