4

そうでない場合、関数の正規名は? 「サイクル」は私には理にかなっていますが、それは取られています.

ヘッダーの例は、わかりやすく簡潔にするために書かれています。私が取り組んでいる実際のケースには、多くの繰り返しがあります。(たとえば、[1, 1, 0, 0, 0, 2, 1] を [0, 0, 2, 1, 1, 1, 0] に「一致」させたい)

この種のことは、私のアルゴリズムを覆い隠し、コードを無駄な繰り返しで埋め尽くしています。

4

3 に答える 3

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関数をジェネレーターに変えることで、この効果を実現することもできます。

于 2012-11-21T16:04:22.187 に答える
5

先ほどの質問を誤解しました。l1リストのサイクルがリストに一致するかどうかを確認したい場合l2、最良の(最もクリーンな/最もpythonicな)方法はおそらくany(l1 == l2[i:] + l2[:i] for i in xrange(len(l2))). rotate便利な方法もありcollections.dequeます。

于 2012-11-21T16:03:11.410 に答える
0

itertoolscycleから、一緒に使用して切り取ることができます。これは基本的にこの答えをリスト内包表記に入れるので、リストは要素ごとに1回シフトされます。islice

>>> 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)]
于 2012-11-21T16:31:24.930 に答える