在循环中打开多个文件,并基于索引对其求和(python)

在循环中打开多个文件,并基于索引对其求和(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

我是python新手,对SO更是新手,所以我希望我能正确回答这个问题

我有一个列表列表(3D),其中所有元素都是指向包含数据的特定文本文件的路径。就像这样(这只是一个例子):

我需要根据这些文件的索引,对这些文件中的值求和,以便得到:

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