我正在尝试比较两个列表以确定一个是否是另一个的旋转(循环排列),例如:
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 的所有可能旋转的列表,然后比较每一个。是否可以在不建立中间列表的情况下做到这一点?性能并不重要,因为列表通常只有四个项目长。我主要关心的是代码的清晰度。
列表将始终具有相同的长度。
最佳答案(保留匹配轮换列表)似乎是:
def _compare_rotated_lists(a, b):
return [i for i in range(len(b)) if a == b[i:] + b[:i]]