在循环中打开多个文件,并基于索引对其求和(python)
我是python新手,对SO更是新手,所以我希望我能正确回答这个问题 我有一个列表列表(3D),其中所有元素都是指向包含数据的特定文本文件的路径。就像这样(这只是一个例子): 我需要根据这些文件的索引,对这些文件中的值求和,以便得到:在循环中打开多个文件,并基于索引对其求和(python),python,file-io,nested-lists,Python,File Io,Nested Lists,我是python新手,对SO更是新手,所以我希望我能正确回答这个问题 我有一个列表列表(3D),其中所有元素都是指向包含数据的特定文本文件的路径。就像这样(这只是一个例子): 我需要根据这些文件的索引,对这些文件中的值求和,以便得到: result1 = text01 + text10 + text19 result2 = text02 + text11 + text20 result3 = ... 因此,子列表中的每个元素都与所有子列表中相应的元素相加。 到目前为止,如果我为每个j编写一个i
result1 = text01 + text10 + text19
result2 = text02 + text11 + text20
result3 = ...
因此,子列表中的每个元素都与所有子列表中相应的元素相加。
到目前为止,如果我为每个j编写一个if循环,我能够得到正确的结果:
然后就来了
if i == 0 and j == 1:
...
if i == 0 and j == 2:
...
如果我只有几个文件的话,这就行了
但是我想把它推广到大量的文件中,我不知道如何在一个循环中基于索引打开和求和文件,所以我得到了正确的结果。
我觉得即使是这个版本的代码也很粗糙,不是pythonic,但它很有效,这就是我所得到的
任何关于改进和如何从这里开始的建议都将受到高度赞赏 我不认为您可以避免使用for cycles,因为您每次都需要读取
.txt
文件,除此之外,像这样的东西应该可以正常工作
n=0
# Thinking of you lists as a 3d matrix, start by cycling on the rows
for j in range(len(lists[0])):
# then on the columns
for i in range(len(lists[0][0])):
# initialize f here
f = 0
# finally on the depth
for k in range(len(lists)):
# update f.
f += np.loadtxt(lists[k][j][i], comments='#', skiprows=1, usecols=(2,3,5,6))
#save f
np.savetxt(path0 + 'result%i' %n, f, fmt='%f %f %f %f %f')
# update n
n += 1
另一方面,您可以连接列表并保存for cycle,我认为您不能避免使用for cycles,因为您每次都需要读取
.txt
文件,除此之外,类似这样的内容应该可以正常工作
n=0
# Thinking of you lists as a 3d matrix, start by cycling on the rows
for j in range(len(lists[0])):
# then on the columns
for i in range(len(lists[0][0])):
# initialize f here
f = 0
# finally on the depth
for k in range(len(lists)):
# update f.
f += np.loadtxt(lists[k][j][i], comments='#', skiprows=1, usecols=(2,3,5,6))
#save f
np.savetxt(path0 + 'result%i' %n, f, fmt='%f %f %f %f %f')
# update n
n += 1
另一方面,您可以将列表连接起来并保存一个for cycle为什么要切换OP对
i
和k
的使用?因为您需要从最高级别开始,从最低级别开始,以相反的顺序进行切片。该切片应返回OP请求的结果。您可以通过将np.loadtxt(…)
替换为列表[k][j][i]
,初始化f=”“
并删除保存部分来验证它。我理解您为什么切换循环嵌套顺序;这与我将要发布的内容基本相同。我问你为什么要切换哪个变量服务于哪个维度。这是一个小问题。哦,对不起,我认为它使代码更可读,如果它实际上使代码更不可读,我可以编辑它。谢谢你,它工作得很好,而且变量重命名不是问题,我理解发生了什么。你为什么要切换OP使用的I
和k
?因为你需要按相反的顺序切片,从最高层次开始,到最低层次。该切片应返回OP请求的结果。您可以通过将np.loadtxt(…)
替换为列表[k][j][i]
,初始化f=”“
并删除保存部分来验证它。我理解您为什么切换循环嵌套顺序;这与我将要发布的内容基本相同。我问你为什么要切换哪个变量服务于哪个维度。这是一个小问题。哦,对不起,我认为它使代码更可读,如果它实际上使代码更不可读,我可以编辑它。谢谢你,它这样工作很好,变量重命名不是问题,我理解发生了什么。
n=0
# Thinking of you lists as a 3d matrix, start by cycling on the rows
for j in range(len(lists[0])):
# then on the columns
for i in range(len(lists[0][0])):
# initialize f here
f = 0
# finally on the depth
for k in range(len(lists)):
# update f.
f += np.loadtxt(lists[k][j][i], comments='#', skiprows=1, usecols=(2,3,5,6))
#save f
np.savetxt(path0 + 'result%i' %n, f, fmt='%f %f %f %f %f')
# update n
n += 1