在 Python 中搜索字典列表的有效方法

Efficient way to search a list of dictionaries in Python

我的当前词典列表如下所示:

  x =[{u'id': 813, u'overlap': 1.0},
      {u'id': 811, u'overlap': 0.002175817439439302},
      {u'id': 812, u'overlap': 0.012271742728263339},
      {u'id': 814, u'overlap': 0.9182077233294997},
      {u'id': 815, u'overlap': 0.8866809411969082},
      {u'id': 117, u'overlap': 0.9173796235219325},
      {u'id': 816, u'overlap': 0.9460961805523018},
      {u'id': 116, u'overlap': 0.2038311249297872},
      {u'id': 817, u'overlap': 0.7302323133830623},
      {u'id': 818, u'overlap': 0.81532953091762},
      {u'id': 819, u'overlap': 0.2817392052504116},
      {u'id': 820, u'overlap': 0.7905202140586483},
      {u'id': 821, u'overlap': 0.8497466449368322},
      {u'id': 822, u'overlap': 0.8503886863531487},
      {u'id': 823, u'overlap': 1.0}]

我想找到 id==820 的重叠部分,即 0.7905202140586483

如何在很少的几行 python 代码中高效而优雅地完成它? (我将遍历数百万个这样的数组)。

x2 = {d["id"]:d["overlap"] for d in x}
print x2[820]

如评论中所述使用字典

或从 mongo 查询,其中 id=820 (不确定如何..只使用了 mongo 几次)

您可以使用字典推导式进行如下操作:

a_dict = {v['id']: v['overlap'] for v in x};

这导致:

for id,overlap in a_dict.items():
    print(id, overlap)

# output

811 0.002175817439439302
812 0.012271742728263339
813 1.0
814 0.9182077233294997
815 0.8866809411969082
816 0.9460961805523018
817 0.7302323133830623
818 0.81532953091762
819 0.2817392052504116
116 0.2038311249297872
117 0.9173796235219325
822 0.8503886863531487
823 1.0
820 0.7905202140586483
821 0.8497466449368322

因为每个字典只有两个值(一个 'id' 和一个 'overlap'),我建议你尝试将整个东西转换成一个大字典,然后从那里开始。类似于:

x_dict = {entry['id']: entry['overlap'] for entry in x}

然后你可以通过调用 .get() 获得你想要的值:

x_dict.get(id)

效率视情况而定。值得注意的是,将其转换为 dict 并非没有代价。如果您几乎使用所有项目,请将其转换为建议的字典。如果您只使用列表中的几个项目,这会更有效率:

d = {v['id']: v['overlap'] for v in x if v['id'] in (820, 811, 117)}

一个小测试(包含问题中的列表)表明,如果您只查找 2/15 个项目,这会使使用时间减少约 33%。在超过 15 项中的 5-6 项时,它不再更快。

您必须自己测试它如何扩展到更大的列表(您可以使用 timeit.timeit)。如果您能够创建列表的字典 而不是 ,那就去做吧。否则,如果这是您应用程序的性能关键部分,请进行一些测试,看看哪种方式最适合您的情况。