【问题标题】:Is there a way to compare two lists of dicts in python efficiently?有没有办法有效地比较 python 中的两个字典列表?
【发布时间】:2011-04-12 12:25:07
【问题描述】:

我有两个字典列表。第一个列表包含根据x、y、z、半径的球体定义。第二个列表包含空间中的各个点,如 x、y、z。这些列表都很长,因此遍历每个列表并与所有值进行比较是低效的。

我一直在尝试 map 和 reduce 项,但它们都只在过滤函数中占用 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)。对于大型列表,这变得非常低效。我想过滤掉落在任何球体半径内的节点。

【问题讨论】:

    标签: python performance list filter compare


    【解决方案1】:

    试试这个:

    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(,`filter 的结果将是你想要的集合。

    另外,为什么sphere['radius'] 还不是一个浮点数?这将在一个非常庞大的列表中加快速度。

    【讨论】:

    • 存在类型转换是因为我在初次读取时没有进行类型转换。我从 txt 文件中获取数据,因此它被解析为字符串。我现在已经更正了。感谢您对代码的建议。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我正在尝试检测落入球体的点。我没有考虑过使用矩阵计算。构建球体矩阵并与节点矩阵进行比较可能更有用和更有效。谢谢你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多