为了账号安全,请及时绑定邮箱和手机立即绑定

在python 2.7中更快地从大列表中搜索ID?

在python 2.7中更快地从大列表中搜索ID?

白板的微信 2021-09-14 21:15:36
所以我有这两个列表:image_names = ["IMG_1.jpg", "IMG_2.jpg"]data = [{"name": "IMG_1.jpg", "id": "53567"},        {"name": "IMG_2.jpg", "id": "53568"},        {"name": "IMG_3.jpg", "id": "53569"},        {"name": "IMG_4.jpg", "id": "53570"}]我想在数据中的images_names 中搜索第一个项目,然后是下一个项目,依此类推,如果它具有相同的名称以获取ID 并将其添加到列表中。这就是我这样做的方式:for image_name in image_names:    for datum in data:        datum_name = datum.get("name", None)        if datum_name == image_name:           images_ids.append(datum.get("id", None))现在它工作得很好,但我认为一旦我在图像名称和数据中获得大量数据,这真的效率低下。Python 中执行此操作的最佳方法是什么?我正在使用 python 2.7
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

主要问题是您的数据结构没有设置为您想要的访问权限。而不是一个字典列表,让它成为你想要使用的自然字典:


data = {"IMG_1.jpg": "53567",

        "IMG_2.jpg": "53568",

        "IMG_3.jpg": "53569",

        "IMG_4.jpg": "53570"}

现在,您只需列出相应的ids列表即可


images_ids = [data[img] for img in image_names]

如果您需要两种访问方法(如果您仍然需要name和id标签),那么我建议您学习使用 Pandas 数据框,将name和id用作列。这将为您提供两种方法中最好的。


查看完整回答
反对 回复 2021-09-14
?
莫回无

TA贡献1865条经验 获得超7个赞

>>> images_ids = [filter(lambda x: x['name'] == name, data) for name in image_names]

>>> images_ids = [i[0]['id'] for i in images_ids if i]

>>> images_ids

['53567', '53568']


查看完整回答
反对 回复 2021-09-14
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

其他选择:


[ item["id"] for item in data if item["name"] in image_names]

#=> ['53567', '53568']

当同名图像存在不同 id时,它也适用:


data = [{"name": "IMG_1.jpg", "id": "53500"},{"name": "IMG_1.jpg", "id": "53501"}]

#=> ['53500', '53501']


查看完整回答
反对 回复 2021-09-14
  • 3 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号