Python嵌套列表列表值操作

时间:2018-04-19 11:16:10

标签: python python-3.x list

我有

形式的两个嵌套列表
[ 
  [ [.3 .1 .2]
    [.2 .1 .5] 
    ... (224 lists)
    [.6 .9 .4] ]

    ... (224 lists)

  [ [.1 .7 .5]
    [.3 .8 .4]
    ... (224 lists)
    [.2 .6 .9] ]  
]

我想对它进行以下操作。第1步:

a = 1st list items
b = 2nd list items

[ 
  [ [a0-b0 a1-b1 a2-b2]
    [.. .. ..]
    ... (224 lists)
    [.. .. ..] ]

    ... (224 lists)

  [ [.. .. ..]
    [.. .. ..]
    ... (224 lists)
    [.. .. ..] ]  
]

步骤2:设a0-b0 = A0,a1-b1 = B0,a2-b2 = C0。

[  [sqrt(A0**2+B0**2+C0**2) .. ..]
   ... (224 lists)
   [.. .. ..]
]   

第3步:

# Let sqrt(A0**2+B0**2+C0**2) = z. So we get :
[  [z0 z1 z2]
   ... (224 lists)
   [.. .. ..]
]

在第三步中,我们想要对嵌套列表的所有元素求和。

我的尝试:

# two nested lists are tupfl and t2
difflay1 = [ [ [0 for i in range(3)] for i in range(224)] for i in range(224)]
rtsqlay2 = [ [0 for i in range(3)] for i in range(224)]

for i in range(224):
    for j in range(224):
        for k in range(3):
            difflay1[i][j][k] = tupfl[i][j][k] - t2[i][j][k]
for i in range(224):
    for j in range(224):
        for k in range(3):
            alpha = difflay1[i][j][0]
            beta = difflay1[i][j][1]
            theta = difflay1[i][j][2]
            rtsqlay2[i][k] = math.sqrt(alpha**2 + beta**2 + theta**2)

def nested_sum(L):
    total = 0  
    for i in L:
        if isinstance(i, list):
            total += nested_sum(i)
        else:
            total += i
    return total
print(nested_sum(rtsqlay2))

我不确定这段代码是否符合我的要求。但是,它会打印一些浮点数。如果这不对,错误在哪里或如何继续?

1 个答案:

答案 0 :(得分:1)

你尝试使用numpy吗?使用numpy数组会使列表占用更少的空间,代码运行得更快,并且更容易运行。

要获取difflay1和rtsqlay2,您可以执行以下操作而不是循环

difflay1 = tufpl - t2
rtsqlay2 = np.sqrt(np.sum(np.square(difflay1),axis=2))

用于执行嵌套求和,已经有一个函数来执行此操作,称为np.sum(L)

总体而言,您的代码如下所示:

import numpy as np

tupfl = np.array(tupfl)
t2 = np.array(t2)
difflay1 = tufpl - t2
rtsqlay2 = np.sqrt(np.sum(np.square(difflay1),axis=2))
print(np.sum(rtsqlay2))

它更短,更容易调试,因为您可以立即看到任何问题。例如,在您的代码中,您将rtsqlay2定义为列表列表而不是列表列表。结果,对于每个i和k rtsqlay2[i][k]被定义224次,对于j的每个值一次,并且仅保留最后一个。这表示代码表现不尽如人意,但不会引发错误。哪些numpy数组,这些错误变得更容易捕获