【问题标题】:What is an efficient way to convert arrays/lists to dictionaries?将数组/列表转换为字典的有效方法是什么?
【发布时间】:2015-12-22 17:04:02
【问题描述】:

我正在尝试以最有效(即最快)的方式将数组信息转换为列表。

我有一个称为 node_map 的列表,我想将其作为字典的键,然后是我想与 node_map 关联的节点坐标 (node_coords_tmp) 的 3D 数组。

Node_map 看起来像:

[1,2,3,4,5]

Node_coords 在最初打印时报告为:

(<exodus.c_double_Array_8352100 object at 0x2c2d8c0>, <exodus.c_double_Array_8352100 object at 0x2c2d5f0>, <exodus.c_double_Array_8352100 object at 0x2c2d560>)

最初我是这样填写字典的:

    for ct,i in enumerate(node_map):
        node_coords[i] = [node_coords_tmp[0][ct],node_coords_tmp[1][ct],node_coords_tmp[2][ct]]

这满足了我的要求,但是对于我正在处理的数组的大小而言,它比我想要的要慢。有没有更好的方法来使用 numpy 或其他形式来做到这一点?谢谢。

【问题讨论】:

  • 您如何想象在少于 O(n) 的时间内填充字典?您必须遍历每个项目。
  • 它将是 O(n),但系数可能很大,具体取决于 OP 正在处理的具体 n..
  • @dimo 并非所有具有相同对数估计的算法都在完全相同的时间执行。
  • 当然不是,但如果您关心的是输入的大小,那么您是在询问渐近复杂度。

标签: python arrays performance dictionary


【解决方案1】:

尝试听写理解..

node_coords = { i: (node_coords_tmp[0][ct],
                    node_coords_tmp[1][ct],
                    node_coords_tmp[2][ct]) for ct, i in enumerate(node_map) }

【讨论】:

  • 乍得,谢谢。我不得不去 python2.6 命名法(你认为这会不会有任何时间惩罚,使用 2.6 而不是 2.7 风格的字典理解?)。它快了大约 5%,这是一个收获,但我也可能需要跳到一些并行的东西。我通过使用 np.add 而不是对压缩列表理解的 sums 显着加快了一些列表添加,并希望我能在这里找到类似的东西。我可能会转向一种新方法或通过 MPI 推进。再次感谢。
  • 应该和使用dict( (i,(...)) for ct, i in enumerate(...) )差不多
猜你喜欢
  • 2019-02-18
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2020-10-24
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
相关资源
最近更新 更多