在python中获取列表的旋转
我想要所有可能的单右移数组:在python中获取列表的旋转,python,list,Python,List,我想要所有可能的单右移数组: def gen(total): rot = [] init = [0]*total init[0] = 1 print init rot.append(init) for i in range(total-1): init[i] = init[i] - init[i+1] init[i+1] = init[i] + init[i+1] init[i] = init[i+1
def gen(total):
rot = []
init = [0]*total
init[0] = 1
print init
rot.append(init)
for i in range(total-1):
init[i] = init[i] - init[i+1]
init[i+1] = init[i] + init[i+1]
init[i] = init[i+1] - init[i]
print init
rot.append(init)
return rot
rot = gen(8)
print rot
这张照片
[1, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 1]
我希望这是一个列表列表。我初始化一个数组rot
,但附加到它会创建相同的行
[[0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1]]
如何处理这个问题
注:我不想像numpy.eye(8)
那样使用numpy。您应该像下面这样附加一份生成列表的副本:
from copy import deepcopy
def gen(total):
rot = []
init = [0]*total
init[0] = 1
print init
for i in range(total-1):
init[i] = init[i] - init[i+1]
init[i+1] = init[i] + init[i+1]
init[i] = init[i+1] - init[i]
#print init
rot.append(deepcopy(init))
return rot
rot = gen(8)
print rot
您还可以使用
copy.copy
而不是copy.deepcopy
现有答案很好地解决了现有代码的问题,因此这里有一种完全不同的方法:
>>> [[int(a==b) for b in range(8)] for a in range(8)]
[[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1]]
(为了清晰起见,我在输出中添加了一些换行符)因为您总是修改同一个对象,所以附加的对象也总是相同的。修改
init
时,rot
的每个条目都将看到更改,因此每个元素都是init
的最后一个状态。为了避免这种情况,您需要创建不同的对象,然后将其附加到rot
您的问题是您没有复制列表,但您的代码似乎不必要地复杂。这似乎同样有效:
def gen(n):
res = [[0 for j in xrange(n)] for i in xrange(n)]
for i in xrange(n):
res[i][i] = 1
return res
为什么不使用双端队列
import collections
def gen(total):
init = [0]*total
init[-1] = 1
d = collections.deque(init)
return [list(d) for _ in range(len(d)) if not d.rotate(1)]
显示带附加的完整代码。请不要使用该方法交换两个数字。这是一种骇人听闻的黑客攻击(对于异或版本也是如此),可读性不强,并且会出现大整数故障。Python已经有了交换值的语法:
init[i],init[i+1]=init[i+1],init[i]
。Python具有无上限的长整数,因此交换技术应该是安全的。“我确实同意不应该使用它。”凯文说得对。与正确的方法相比,它太难理解了(事实上,我发现它比天真地使用临时变量更不透明)。