gpt4 book ai didi

python-3.x - 如何仅更改二维列表的对角线元素?

转载 作者:行者123 更新时间:2023-12-05 08:37:09 24 4
gpt4 key购买 nike

所以我尝试创建一个 NxN 二维数组,然后将其对角线元素更改为 1。这是我的代码:

arr=[1,1,1,2,2,2]
table=[[0]*len(arr)]*len(arr)
for i in range(0,len(arr)):
table[i][i]=1
print(table)

但是,每当我运行这段代码时,我都会得到这样的输出:

[[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1]]

我正在寻找这个:

[[1, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1]]

我已经盯着我的代码看了好几个小时了,我不知道哪里出了问题

最佳答案

有趣的是,您实际上只在 for 循环中编辑 一个 列表,但只有五个指向该列表的指针。 (在这种情况下,列表将是 [0, 0, 0, 0, 0, 0]。)您可以通过在 table 中打印每个列表的 ID 来查看这一点> 通过使用 id():

>>> for t in table:
print(id(t))

2236544254464
2236544254464
2236544254464
2236544254464
2236544254464
2236544254464

您的号码可能与我的不同,但它们都是相同的号码。通过在每个索引赋值语句之后放置一个 print(table) 语句,您还可以看到对一个列表的编辑已应用于 table 中的其他列表。

因此,为了“解决”这个问题,我建议改用列表推导式。例如:

table = [[0]*len(arr) for _ in range(len(arr))]

如果您检查每个列表的 ID:

>>> for t in table:
print(id(t))


2236544617664
2236544616064
2236544616320
2236544615872
2236544618368
2236544622720

由于它们不同,您现在可以使用仅更改对角线的方法:

>>> for i in range(0,len(arr)):
table[i][i]=1

>>> table
[[1, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1]]

关于python-3.x - 如何仅更改二维列表的对角线元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66593157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com