在列表中查找重复的元素并平均相应的元素

2024-09-28 19:34:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码中有以下类型的列表:

nodes = [[n1, [x1,y1,z1], [a1,b1,...]], [n2, [x2,y2,z2], [a2,b2,..]], ...]

元素n标识具有特定坐标[x,y,z]的节点,这些可以通过列表重复。 我想对每个节点值的[an,bn,…]列表求平均值n,这样我就得到了一个列表节点\u平均值,比如[[[x1,y1,z1],[a1,b1,…],[[xn,yn,zn],[an,bn,…]]

例如,如果我有以下列表:

nodes= [[10, [6.5, 55.2, -10.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]], 
        [10, [6.5, 55.2, -10.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]],
        [3, [4.3, 55.4, -15.0], [-0.0016, -0.00058, -0.0256, -7.07e-06, 0.00051, 0.0088]],
        [1, [8.7, 54.9, -15.0], [-0.0016, -0.00058, -0.0256, 1.2e-05, -0.00044, 0.0088]],
        [10, [6.5, 55.2, -10.0], [-0.0011, -0.00041, -0.027, -1.12e-05, -0.00043, 0.0038]],
        [3, [4.3, 55.4, -15.0], [-0.00113, -0.000413, -0.027, 2.84e-06, 0.00039, 0.00389]]]

我想获得(订单不重要):

nodes_avg= [[[6.5, 55.2, -10.0], [-0.00036666666666666667, -0.00013666666666666666, -0.009, -3.7333333333333333e-06, -0.00014333333333333334, 0.0012666666666666666]],
            [[4.3, 55.4, -15.0], [-0.001365, -0.0004965, -0.0263, -2.115e-06, 0.00045, 0.006345]], 
            [[8.7, 54.9, -15.0], [-0.0016, -0.00058, -0.0256, 1.2e-05, -0.00044, 0.0088]]]

到目前为止,我的方法是提取节点范围的列表:

noderng = [n1, n2,..., nn]

并使用node_range=list(dict.fromkeys(node_range))消除重复的节点,然后迭代两个列表以将节点列表中的元素n匹配到节点范围列表中的元素,如下所示:

noderng=[]
for l in nodes:
    noderng.append(l[0])
noderng=list(dict.fromkeys(noderng))

nodeavg={}
elposition={}

for n in noderng:
    nodeavg[n]=[[],[],[],[],[],[]]
    for l in nodes:
        if int(l[0])==int(n):
            for i in range(6):
                nodeavg[n][i].append(l[2][i])
            elposition[n]=l[1]

avg={}    
for key, strains in nodeavg.items():
    avg[key]=[]
    for ess in strains:
        avg[key].append(sum(ess)/len(ess))

nodes_avg=[]
for key ,value in avg.items():
    nodes_avg.append([elposition[key],value])

我得到了期望的结果,问题是节点列表可能有成百上千个元素,执行此操作需要几个小时。我已经改用了numpy阵列,它确实有点帮助,但它只缩短了几分钟,这不是一个很大的帮助

有没有更有效的方法来执行此操作


Tags: keyin元素列表for节点rangeavg
1条回答
网友
1楼 · 发布于 2024-09-28 19:34:38

这不是答案,只是一些建议:

  1. 您可以使用timercProfile来了解代码的哪一部分需要更多的时间,并将注意力集中在这一部分上

  2. 另一个在过去对我有效的建议是从包含键的集合中创建字典。通过这种方式,可以减少散列时间。如果您事先知道所有的n值,那么这是可行的

  3. 选中this可以更好地理解Python中不同结构的时间复杂性

相关问题 更多 >