1

我已经使用了一种反转数组对角线的算法。我正在尝试将列表复制ab不可变的。

我尝试使用“切片”( b = a[:])、列表理解,b = a.copy()但唯一有效的是b = copy.deepcopy(a). 有没有其他方法可以获得副本?

import copy
a = [[1,2,3],[4,5,6],[7,8,9]]
b = copy.deepcopy(a)
d = b
c = []

h = len(a[0])-1
x_ptrocar = []

for i in range(len(a)-1):
    if i == h:
        break
    else:
        x_ptrocar.extend([[i,i,h,h],[i,h,h,i],[h,h,i,i],[h,i,i,h]])
        h -=1
for l in range(len(x_ptrocar)):
    for m in range(0,4):
        y_original = x_ptrocar[l][3]
        y_ptrocar = x_ptrocar[l][1]
        x_original = x_ptrocar[l][2]
        x_ptrocarr = x_ptrocar[l][0]
        a[x_original][y_original]=b[x_ptrocarr][y_ptrocar]
print(a)

我希望输出为[[1,2,3],[4,5,6],[7,8,9]][[9,2,7], [4,5,6],[3,8,1]]并且它适用于copy.deepcopy,但不适用于我能找到的任何其他方法。

4

1 回答 1

1

copy.deepcopy为此,拉入一个模块并增加功能开销是过大的。由于您有一个列表列表,因此制作外部列表的副本b = a[:]是不够的,因为两者中的内部列表都a指向b相同的对象。

您可以按如下方式使用列表推导:

b = [x[:] for x in a]

这需要 中的每个列表的切片a,创建每个子列表的新副本而没有别名。


顺便说一句,逻辑可以稍微简化——走到矩阵的中心,沿途交换左上/右下和右上/左下的单元格:

def reverse_diagonals(m):
    m = [x[:] for x in m]

    for i in range(len(m) // 2):
        m[i][i], m[-i-1][-i-1] = m[-i-1][-i-1], m[i][i]
        m[i][-i-1], m[-i-1][i] = m[-i-1][i], m[i][-i-1]

    return m

这假设一个 nxn 矩阵。

于 2019-09-03T02:04:39.147 回答