簡體   English   中英

如何在Python中操作嵌套列表?

[英]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]

更通用的方法是使用Python列表理解。

您可以對每個列分別執行所需的操作。 以下示例完全滿足您的要求...

new_matrix = [[i[0]-37, i[1]-37, i[2]] for i in a]

如果您不想對其進行硬編碼,則可以從初始列表中確定數字37的位置。

這是一個很好的教程 ,介紹了列表推導如何在Python中工作。

您可以嘗試以下簡單的方法:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM