我正在尝试比较两个列表,以确定它们是否是彼此的旋转(循环置换),例如:
a = [1, 2, 3]
b = [1, 2, 3] or [2, 3, 1] or [3, 1, 2]
所有匹配项为“matches”,而:
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
这段代码生成了一个旋转列表,并逐一比较每个旋转。是否有可能不生成中间列表而实现同样的功能?由于这些列表通常只包含四个项目,因此性能并不重要。我的主要关注点是代码的清晰易懂。
这些列表的长度始终相同。
最佳答案(保留匹配旋转列表)似乎是:
def _compare_rotated_lists(a, b):
return [i for i in range(len(b)) if a == b[i:] + b[:i]]
list
转换为deque
并旋转其中一个列表即可。 - Bakuriu