干净的方式来完成 - 如果在[(0,1,2),(2,0,1),(1,2,0)]中的x:?

时间:2012-11-21 16:02:33

标签: python

如果没有,那么函数的规范名称是什么? “循环”对我有意义,但已经采取了这种做法。

标题中的示例是为了清晰和简洁而编写的。我正在处理的真实案例有很多重复。 (例如,我希望[1,1,0,0,0,1,1]“匹配”[0,0,2,1,1,1,0])

这种类型的东西模糊了我的算法,并用无用的重复填充我的代码。

3 个答案:

答案 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中的cycleislice来切断它。这基本上将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)]