我有一个像下一个矩阵,但是更大:
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的新手。 :)
答案 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