如果没有,那么函数的规范名称是什么? “循环”对我有意义,但已经采取了这种做法。
标题中的示例是为了清晰和简洁而编写的。我正在处理的真实案例有很多重复。 (例如,我希望[1,1,0,0,0,1,1]“匹配”[0,0,2,1,1,1,0])
这种类型的东西模糊了我的算法,并用无用的重复填充我的代码。
答案 0 :(得分:8)
您可以使用以下内容获取列表的周期:
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
函数转换为生成器来实现此效果。
答案 1 :(得分:5)
早些时候误解了你的问题。如果要检查列表l1
的任何循环是否与列表l2
匹配,则最佳(最干净/最pythonic)方法可能是any(l1 == l2[i:] + l2[:i] for i in xrange(len(l2)))
。 <{3}}中还有rotate
方法,您可能会发现它很有用。
答案 2 :(得分:0)
您可以使用itertools中的cycle
和islice
来切断它。这基本上将this answer置于列表推导中,因此列表将针对每个元素移位一次。
>>> from itertools import islice, cycle
>>> l = [0,1,2]
>>> [tuple(islice(cycle(t),i,i+len(t))) for i,_ in enumerate(l)]
[(0, 1, 2), (1, 2, 0), (2, 0, 1)]