如果没有,那么函数的规范名称是什么?'循环'对我来说很有意义,但是已经采取了这种做法.
标题中的示例是为了清楚和简洁而编写的.我正在处理的真实案例有很多重复.(例如,我希望[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
,你可能会发现有用.
归档时间: |
|
查看次数: |
122 次 |
最近记录: |