在Python2.7中更快地从大列表中搜索ID?

2024-05-17 13:01:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子:

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"}]

我想先搜索图像中的第一个项目,然后搜索下一个项目,依此类推,然后搜索数据中的名称,如果名称相同,则获取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中最好的方法是什么?我使用的是python2.7


Tags: 数据项目namein图像image名称id
3条回答

其他选项:

[ 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']

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

data = {"IMG_1.jpg": "53567",
        "IMG_2.jpg": "53568",
        "IMG_3.jpg": "53569",
        "IMG_4.jpg": "53570"}

现在,创建相应的id列表所需的就是

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

如果您需要这两种访问方法(如果您仍然需要nameid标签),那么我建议您学习使用Pandas数据帧,其中nameid作为列。这将给你最好的两种方法。你知道吗

>>> 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']

相关问题 更多 >