[英]How to get all elements of 2D array by slice in python
我想設置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
您可以在線初始化列表。 這對於文字列表是可以的,但對於第二個維度將失敗,因為它將保持對同一內部列表的101個引用。 更改其中的一個元素將對所有其他索引產生影響。
您想要像這樣初始化您的列表:
G = [[0] * 101 for x in range(102)]
接下來的事情是, [:]
call會創建列表的硬拷貝。 那么這里發生的是:
G[0][:]
取你的2d列表的第一列並硬拷貝。 G[:][0]
硬復制整個2d列表,然后返回第一列。 您可能不希望一直復制整個列表,丟失其引用並僅對副本進行更改。
假設您的第一個維度引用了列,而您的第二個維度引用了行 :
將列的所有元素設置為1
:
G[0] = [1] * 101
將行的所有元素設置為1
:
for i in range(102): G[i][0] = 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)]
首先,您創建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]]
首先,你需要了解[[0]*101]*101
真正做到了什么。 G
的類型是list of list
,但是外部列表G
中的每個條目是對相同列表的引用。 請參閱Python列表,意外地反映在子列表中的更改 。 大多數時候這不是你想要的。
其次, G[1][:]
是一個切片,需要右側的可迭代對象。 有多種方法可以實現連續設置所有值,因為您還可以將條目設置為新列表。 由於您還需要在不同的行中更改值,因此我建議使用for循環開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.