我想将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,我怎么能这样做?
答案 0 :(得分:3)
这里有一些缺陷。
首先,作业的左侧产生一个可迭代的,因此您无法为其指定标量。相反,右侧(在您的情况下为1
)需要是相等长度的可迭代,例如:
G[0][:] = [0] * 101 # Warning: Copied code from question, still flawed
您可以在线初始化列表。这对于文字列表是可以的,但对于第二个维度将失败,因为它将包含对相同内部列表的101个引用。更改其中的一个元素将对所有其他索引产生影响。
您想要像这样初始化您的列表:
G = [[0] * 101 for x in range(102)]
接下来,[:]
- 调用会创建列表的硬拷贝。那么这里发生的是:
G[0][:]
获取您的2d列表的第一列并进行硬拷贝。G[:][0]
硬复制整个2d列表,然后返回第一列。您可能不想要一直复制整个列表,丢失其引用并仅对副本进行更改。
假设您的第一个维度引用列,而您的第二个维度引用行:
将列的所有元素设置为1
:
G[0] = [1] * 101
将行的所有元素设置为1
:
for i in range(102): G[i][0] = 1
答案 1 :(得分:1)
您得到的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)]
答案 2 :(得分: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]]
答案 3 :(得分:1)
首先,您需要了解[[0]*101]*101
的真正含义。
G
的类型为list of list
,但外部列表G
中的每个条目都是对同一列表的引用。见Python list of lists, changes reflected across sublists unexpectedly。大多数情况下,这不是你想要的。
其次,G[1][:]
是一个切片,需要右侧的可迭代对象。有多种方法可以实现连续设置所有值,因为您还可以将条目设置为新列表。由于您还需要在不同的行中更改值,因此我建议首先使用for循环。