[英]How do you manipulate nested lists in Python?
我有一個類似下一個矩陣,但更大的矩陣:
m = [[38, 38, 0],
[39, 38, 0],
[40, 38, 0],
[41, 38, 3],
[42, 38, 0],
[43, 38, 4],
[44, 38, 4],
[45, 38, 5],
[38, 39, 0],
[39, 39, 0],
[40, 39, 0],
[41, 39, 3],
[42, 39, 0],
[43, 39, 4],
[44, 39, 4],
[45, 39, 5],
[38, 40, 0],
[39, 40, 0],
[40, 40, 0],
[41, 40, 3],
[42, 40, 0],
[43, 40, 4],
[44, 40, 4],
[45, 40, 5]]
我想在循環中更改前兩列的值,使它們從1開始。
結果將是以下矩陣:
[[1, 1, 0],
[2, 1, 0],
[3, 1, 0],
[4, 1, 3],
[5, 1, 0],
[6, 1, 4],
[7, 1, 4],
[8, 1, 5],
[1, 2, 0],
[2, 2, 0],
[3, 2, 0],
[4, 2, 3],
[5, 2, 0],
[6, 2, 4],
[7, 2, 4],
[8, 2, 5],
[1, 3, 0],
[2, 3, 0],
[3, 3, 0],
[4, 3, 3],
[5, 3, 0],
[6, 3, 4],
[7, 3, 4],
[8, 3, 5]]
我希望得到詳細的解釋,因為我是python的新手。 :)
我將在下面回答,但是StackOverflow的一個好習慣是顯示您已經嘗試過的內容以及卡住的位置。 另外,Python目前有兩個主要版本:2.7和3。我不知道您使用的是哪個版本,因此我將使用Python 3中的示例。主要版本沒有太大差異,因此有一個不錯的選擇。這些示例在兩個版本中均適用。
正如@MK Patel在評論中指出的那樣,我們不確定矩陣中的每一行是否包含三個元素,還是僅包含一個(格式錯誤)元素。 我將假設您的意思是[1, 1, 0]
而不是[1. 1. 0.]
[1, 1, 0]
[1. 1. 0.]
[1. 1. 0.]
。
首先,假設您的矩陣在m中: m =[[38, 38, 0.], ...]
遍歷所有行的最簡單方法是:
for row in m:
# do stuff with row
print(row[1]) # print second column
這種方法的問題在於,您必須對自己的行數進行計數(例如,每個循環都可以遞增變量“ rowCount”)。
為了使Python在這里為您完成工作,您可以在矩陣的長度上迭代一個整數。 這樣做是這樣的:
for i in range(len(m)):
# your row is now in m[i]
print(m[i][1]) # print second column
在這里, len(m)
等於數組的長度。 range(n)
是包含[0,1 ...,n]的列表的簡寫。 這樣,您可以將行的第一列(索引0)設置為與行數匹配,因此此列從1開始,並隨循環一起上升。 請記住,Python(和大多數其他編程語言)將從0開始計數,因此您每次必須加1。
由於您想“重新啟動”第二列中每個新值的計數,因此可以使用模( %
)運算符使我每次上升8時就從1重新開始。這是基於我對您的第二列。 在下一段中閱讀更多內容。
for i in range(len(m)):
# set first column to i + 1, to start counting from 1 and go up every time
m[i][0] = (i % 8) + 1
對於您的第二欄,我也缺少一些信息。 有幾種方法可以解決您的問題,具體取決於始終是什么。 最值得注意的是每個數字重復8次,因此我將在代碼中使用這個事實。
我們可以使用整數除法運算符( //
)在迭代器( i
)上升的每8個數字中添加一個。
for i in range(len(m)):
# set first column to i + 1, to start counting from 1 and go up every time
m[i][0] = (i % 8) + 1
# set the second column to (i // 8) + 1, going up one every 8 rows (and start at one)
m[i][1] = (i // 8) + 1
希望對您有所幫助。
您可以在python的一行代碼中解決該問題...此方法稱為理解方法...您的解決方案是...
final_matrix = [[inner_matrix[0]-37, inner_matrix[1]-37, inner_matrix[2]] for inner_matrix in m]
print(final_matrix)
如果您是python的新手,則可以將其作為其他語言來解決,例如...
result= []
for inner_matrix in m:
inner_matrix[0] -= 37
inner_matrix[1] -= 37
result.append(inner_matrix)
print(result)
注意:-上述解決方案對於python來說不是一個好習慣。.這僅是為了您的簡單理解...實際上,您應該使用理解方法來解決它。
如果您不了解理解方法,那么.... 閱讀主題5.1.3
如果您知道第一個單元格包含最小值,則一種簡單的方法是遍歷所有行並通過減去最小值來修改前X列。
換句話說,在您的示例中,最小值為38,因此您只需要在前兩列中減去37。
假設您的矩陣是m
,完整的代碼是:
# get the value that will be translated to 1
# the - 1 is here to start at 1, not 0
start_val = m[0][0] - 1
# iterate over all the rows
for row in m:
# iterate over the first 2 columns
for i in range(2): # i = 0, i = 1
# change the value
row[i] -= start_val
請注意,在此代碼段中,我們直接修改了矩陣“ inplace”。
只是為了好玩,也可以使用這種單行代碼來完成此操作(請參見功能性python編程中的列表理解概念 ):
start_val = m[0][0] - 1
new_m = [[c-start_val for c in row[:2]] + row[2:] for row in m]
您可以嘗試以下簡單的方法:
my_list = [[38, 38, 0, ],
[39, 38, 0, ],
[40, 38, 0, ],
[41, 38, 3, ],
[42, 38, 0, ],
[43, 38, 4, ],
[44, 38, 4, ],
[45, 38, 5, ],
[38, 39, 0, ],
[39, 39, 0, ],
[40, 39, 0, ],
[41, 39, 3, ],
[42, 39, 0, ],
[43, 39, 4, ],
[44, 39, 4, ],
[45, 39, 5, ],
[38, 40, 0, ],
[39, 40, 0, ],
[40, 40, 0, ],
[41, 40, 3, ],
[42, 40, 0, ],
[43, 40, 4, ],
[44, 40, 4, ],
[45, 40, 5, ], ]
first_column = 1
second_column = 1
for i in range(len(my_list)):
if first_column > 8: #if value of first column is greater than 8 then reset first_column and second_column
first_column = 1
second_column = second_column + 1
my_list[i][0] = first_column
my_list[i][1] = second_column
first_column = first_column + 1
print(my_list)
list
first_column
的值大於8,則增加second_column
值並使first_column=1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.