【发布时间】:2016-06-26 14:49:08
【问题描述】:
我想将G[1][0],G[1][1]...G[1][100] 和G[0][1],G[1][1]...G[100][1] 的值设置为1
G = [[0]*101]*101
G[1][:] = 1
G[:][1] = 1
比我得到错误,
...
G[1][:] = 1
TypeError: can only assign an iterable
没有 Numpy 怎么办?
【问题讨论】:
我想将G[1][0],G[1][1]...G[1][100] 和G[0][1],G[1][1]...G[100][1] 的值设置为1
G = [[0]*101]*101
G[1][:] = 1
G[:][1] = 1
比我得到错误,
...
G[1][:] = 1
TypeError: can only assign an iterable
没有 Numpy 怎么办?
【问题讨论】:
这里有一些缺陷。
首先,分配的左侧产生一个可迭代的,因此您不能为其分配标量。相反,右侧(在您的情况下为 1)需要是长度相等的可迭代对象,例如:
G[0][:] = [0] * 101 # Warning: Copied code from question, still flawed
您在线初始化列表。这对于文字列表是可以的,但对于第二维会失败,因为它将包含对 same 内部列表的 101 个引用。更改其中的一个元素将对所有其他索引产生影响。
你想像这样初始化你的列表:
G = [[0] * 101 for x in range(102)]
接下来的事情是,[:]-call 会创建您列表的硬拷贝。所以这里发生的是:
G[0][:] 获取二维列表的第一列并将其硬拷贝。G[:][0] 硬拷贝整个二维列表,然后返回第一列。您可能不想一直复制整个列表,从而丢失其引用并仅对副本进行更改。
假设您的第一个维度是指列,而您的第二个维度是指rows:
将列的所有元素设置为1:
G[0] = [1] * 101
将行的所有元素设置为1:
for i in range(102): G[i][0] = 1
【讨论】:
首先你创建list的方式是错误的
使用循环:
import pprint
lst = [[0]*10 for n in range(10)]
for i in range(len(lst[0][:])): #Iterating over column of first row
lst[0][i] = 1
for j in range(len(lst)): #Iterating over row of first column
lst[j][0] =1
pprint.pprint(lst)
输出:
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
【讨论】:
你得到的 TypeError 是因为你试图将一个 int 分配给一个列表。
我能想到的最简单的解决方案是在要设置为 1 的向量长度上的 for 循环:
for i in range(len(G[1][:])):
G[1][i] = 1
编辑: 我测试了这段代码。当您将 G 实例化为列表的深拷贝列表时,它不适用于您的设置。
实例化矩阵的正确方法是:
G = [[0 for x in range(101)] for x in range(101)]
【讨论】:
首先,您需要了解[[0]*101]*101 的真正作用。
G 的类型是list of list,但外部列表G 中的每个条目都是对同一列表的引用。见Python list of lists, changes reflected across sublists unexpectedly。大多数时候这不是你想要的。
其次,G[1][:] 是一个切片,需要在右侧有一个可迭代对象。有多种方法可以实现连续设置所有值,因为您还可以将条目设置为新列表。由于您还需要更改不同行中的值,因此我建议使用 for 循环开始。
【讨论】:
G[1][:] 和 G[:][1] 不包含元素 G[2][2] 或 G[3][4] 但我得到了一个全部 1 数组。是不是因为“外部列表 G 中的每个条目都是对同一列表的引用”。如你所说?