2 つのリストを比較して、一方が他方のローテーション (巡回順列) であるかどうかを判断しようとしています。
a = [1, 2, 3]
b = [1, 2, 3] or [2, 3, 1] or [3, 1, 2]
はすべて一致しますが、次のようになります。
b = [3, 2, 1] is not
これを行うには、次のコードを用意しました。
def _matching_lists(a, b):
return not [i for i, j in zip(a,b) if i != j]
def _compare_rotated_lists(a, b):
rotations = [b[i:] + b[:i] for i in range(len(b))]
matches = [i for i in range(len(rotations)) if _matching_lists(a, rotations[i])]
return matches
これにより、b のすべての可能な回転のリストが作成され、それぞれが比較されます。中間リストを作成せずにこれを行うことは可能ですか? 通常、リストは 4 項目の長さしかないため、パフォーマンスは重要ではありません。私の主な関心事は、コードの明快さです。
リストは常に同じ長さになります。
最良の答え(一致するローテーションのリストを保持する)は次のようです:
def _compare_rotated_lists(a, b):
return [i for i in range(len(b)) if a == b[i:] + b[:i]]