【发布时间】:2011-07-15 21:28:18
【问题描述】:
只是想知道在 Python 中生成列表的所有循环移位的最有效方法是什么。在任一方向。例如,给定一个列表[1, 2, 3, 4],我想生成:
[[1, 2, 3, 4],
[4, 1, 2, 3],
[3, 4, 1, 2],
[2, 3, 4, 1]]
通过将最后一个元素移到前面来生成下一个排列,或者:
[[1, 2, 3, 4],
[2, 3, 4, 1],
[3, 4, 1, 2],
[4, 1, 2, 3]]
通过将第一个元素移到后面来生成下一个排列。
第二种情况对我来说稍微有趣一些,因为它会产生一个缩减的拉丁方格(第一种情况也给出了一个拉丁方方,只是没有缩减),这就是我试图用来进行实验块设计的方法。它实际上与第一种情况并没有什么不同,因为它们只是相互重新排序,但顺序仍然很重要。
我对第一种情况的当前实现是:
def gen_latin_square(mylist):
tmplist = mylist[:]
latin_square = []
for i in range(len(mylist)):
latin_square.append(tmplist[:])
tmplist = [tmplist.pop()] + tmplist
return latin_square
对于第二种情况:
def gen_latin_square(mylist):
tmplist = mylist[:]
latin_square = []
for i in range(len(mylist)):
latin_square.append(tmplist[:])
tmplist = tmplist[1:] + [tmplist[0]]
return latin_square
第一种情况对我来说似乎应该是相当有效的,因为它使用pop(),但在第二种情况下你不能这样做,所以我想听听关于如何更有效地做到这一点的想法.也许itertools 中的某些内容会有所帮助?或者可能是第二种情况的双端队列?
【问题讨论】:
-
您的实现不起作用 - 他们正在添加列表(整数)和列表,这是不可能的。此外,它们在每次迭代中都附加相同的列表实例,因此您最终会得到一个由 n 次同一行组成的正方形。
-
哎呀,错过了,谢谢。没有实际测试代码:p
标签: python algorithm list permutation