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

时间:2019-02-13 14:24:55

标签: python matrix

我有一个像下一个矩阵,但是更大:

awk -F ',' 'NR==FNR{c[$1]++;next}; <comparison missing>' file_a.csv file_b.csv > new_file.csv

我想更改循环中前两列的值以使它们从1开始。

结果将是以下矩阵:

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

我希望得到详细的解释,因为我是python的新手。 :)

5 个答案:

答案 0 :(得分:2)

假设

我将在下面回答,但是关于StackOverflow的一个好的做法是显示您已经尝试过的内容以及卡住的位置。另外,Python目前有两个主要版本:2.7和3。我不知道您使用的是哪个版本,因此我将使用Python 3中的示例。主要版本没有太大差异,因此有一个不错的选择。这些示例在两种版本中都可以使用。

正如@MK Patel在评论中所述,我们不确定矩阵中的每一行是否包含三个元素,还是仅包含一个(格式错误)元素。我将假设您的意思是[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

我希望这会有所帮助。

答案 1 :(得分:2)

您可以用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来说不​​是一个好习惯。   为了您的容易理解...实际上,您应该使用   理解方法。

如果您不了解理解方法,那么... Read topic 5.1.3

答案 2 :(得分:1)

如果您知道第一个单元格包含最小值,则一种简单的方法是遍历所有行并通过减去最小值来修改前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编程中的 list理解概念):

start_val = m[0][0] - 1
new_m = [[c-start_val for c in row[:2]] + row[2:] for row in m]

答案 3 :(得分:1)

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

您可以对每个列分别执行所需的操作。以下示例完全符合您的要求...

  new_matrix = [a中i的[[i [0] -37,i [1] -37,i [2]]
 

如果您不想对其进行硬编码,则可以从初始列表中确定数字37。

这是关于列表理解在Python中如何工作的很好的教程

答案 4 :(得分:0)

您可以尝试以下简单方法:

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