我目前的词典列表如下所示:
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代码行中高效优雅地完成它? (我将遍历数百万个这样的数组)。
答案 0 :(得分:4)
因为每个字典只有两个值('id'和'overlap'),我建议你尝试将整个字体转换成一个大字典,然后从那里开始。类似的东西:
x_dict = {entry['id']: entry['overlap'] for entry in x}
然后,您可以通过调用.get()来获得所需的值:
x_dict.get(id)
答案 1 :(得分:3)
x2 = {d["id"]:d["overlap"] for d in x}
print x2[820]
如评论中所述使用dict
或从mongo查询id=820
(不确定如何...仅使用mongo几次)
答案 2 :(得分:2)
效率取决于具体情况。值得注意的是,将它转换成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
)。如果您能够创建列表的而不是,那就去吧。否则,如果这是您的应用程序中性能至关重要的部分,请进行一些测试,看看哪种方法最适合您的情况。
答案 3 :(得分:1)
您可以使用词典理解来执行以下操作:
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