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

Sha*_*hay 4 python

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

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

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

cmh*_*cmh 8

您可以使用以下命令获取列表的周期:

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函数转换为生成器来实现此效果.

  • 或者,你可以做任何(b == a [i:] + a [:i] for i in range(len(a)))`这会让你短路:) (3认同)

ars*_*jii 5

之前误解了你的问题.如果要检查列表的任何循环是否与列表l1匹配,可能是l2最好的(最干净/最pythonic)方法any(l1 == l2[i:] + l2[:i] for i in xrange(len(l2))).还有一个rotate在方法collections.deque,你可能会发现有用.