有没有办法有效地比较python中的两个dicts列表?

时间:2010-09-15 06:01:36

标签: python performance list filter compare

我有两个词典列表。第一个列表包含 x,y,z,radius 方面的球体定义。第二个列表包含空间中的各个点 x,y,z 。这些列表都很长,因此迭代每个列表并与所有值进行比较效率很低。

我一直在尝试使用地图并减少术语,但它们在过滤功能中只需要1个术语。我正在使用的是以下内容:

      for curNode in nodeList:
            for i in sphereList:
                    tmpRad = findRadius(i, curNode)
                    if float(tmpRad) <= float(i['radius']):
                            print "Remove node", curNode['num']
                            nodeRemovalList.append(curNode['num'])
                            break

其中i是当前领域(x, y, z, rad)curNode是节点(num, x, y, z)。对于大型列表,这变得非常低效。我想过滤掉任何球体半径范围内的节点。

3 个答案:

答案 0 :(得分:4)

试试这个:

def in_sphere(node):
    return any(float(findRadius(sphere, node)) <= float(sphere['radius']) 
               for sphere in sphereList)

nodeRemovalList = filter(in_sphere, nodeList)

这比您显示的代码运行

这假设您实际上想要nodeRemovalList并且它不仅仅是一个中间步骤。如果它只是一个中间步骤,则返回not any(,过滤器的结果将是您想要的设置。

另外,为什么sphere['radius']不是浮动的?这会在一个非常庞大的列表上加快速度。

答案 1 :(得分:3)

您可能希望查看spatial octrees之类的内容,以减少必须检查每个点的球体数量。

答案 2 :(得分:2)

您是否正在尝试检测哪些点落入球体内。在numpy中使用基于矩阵的方法可能更容易,因为你可以有效地为所有点做一个3d距离向量,让p = point(x1,y1,z1)。设A为球心的阵列,则距离矢量阵列可以是计算机,并与numpy中的半径阵列进行比较。你会发现矩阵运算比迭代更快。