Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中获取列表的旋转_Python_List - Fatal编程技术网

在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具有无上限的长整数,因此交换技术应该是安全的。“我确实同意不应该使用它。”凯文说得对。与正确的方法相比,它太难理解了(事实上,我发现它比天真地使用临时变量更不透明)。