そうでない場合、関数の正規名は? 「サイクル」は私には理にかなっていますが、それは取られています.
ヘッダーの例は、わかりやすく簡潔にするために書かれています。私が取り組んでいる実際のケースには、多くの繰り返しがあります。(たとえば、[1, 1, 0, 0, 0, 2, 1] を [0, 0, 2, 1, 1, 1, 0] に「一致」させたい)
この種のことは、私のアルゴリズムを覆い隠し、コードを無駄な繰り返しで埋め尽くしています。
そうでない場合、関数の正規名は? 「サイクル」は私には理にかなっていますが、それは取られています.
ヘッダーの例は、わかりやすく簡潔にするために書かれています。私が取り組んでいる実際のケースには、多くの繰り返しがあります。(たとえば、[1, 1, 0, 0, 0, 2, 1] を [0, 0, 2, 1, 1, 1, 0] に「一致」させたい)
この種のことは、私のアルゴリズムを覆い隠し、コードを無駄な繰り返しで埋め尽くしています。
リストのサイクルを取得するには、次のようにします。
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
関数をジェネレーターに変えることで、この効果を実現することもできます。
先ほどの質問を誤解しました。l1
リストのサイクルがリストに一致するかどうかを確認したい場合l2
、最良の(最もクリーンな/最もpythonicな)方法はおそらくany(l1 == l2[i:] + l2[:i] for i in xrange(len(l2)))
. rotate
便利な方法もありcollections.deque
ます。