Python 比较对象列表和目录列表

Python 比较对象列表和目录列表,python,list,dictionary,object,Python,List,Dictionary,Object,我是Python新手,我的问题有两个解决方案,但我想知道这是正确的方法还是有更聪明的解决方案 我有一个包含对象的列表,还有一个包含dicts的列表。 两者都包含名称。 我想比较两个列表中是否包含一个名称 包含对象的列表的类 class Person(): def __init__(self, name): self.name = name 为示例创建两个列表 i = 0 while i < 100: person_list.append(Person("test

我是Python新手,我的问题有两个解决方案,但我想知道这是正确的方法还是有更聪明的解决方案

我有一个包含对象的列表,还有一个包含dicts的列表。 两者都包含名称。 我想比较两个列表中是否包含一个名称

包含对象的列表的类

class Person():
def __init__(self, name):
    self.name = name
为示例创建两个列表

i = 0
while i < 100:
    person_list.append(Person("test" + str(i)))
    i += 1

search_list = list()
i = 300
while i > 0:
    search_list.append({"name": "test" + str(i)})
    i -= 1
我不想从person_列表中删除一些东西来缩短迭代,因为我以后会重用它

选项b创建一个新列表,该列表仅包含在此列表中搜索之前的名称

for search in search_list:
    if search["name"] in names:
        print(search["name"] + " found")
        names.remove(search["name"])
    else:
        print(search["name"] + " not found")

您的两种方法每次都必须扫描整对列表(这就是循环中某个列表中的
x
所做的)

我要做的是首先遍历名称列表,构建一个名到索引的
dict

from collections import defaultdict

names_to_indices = defaultdict(list)

for index, search in enumerate(search_list):
    names_to_indices[search["name"]].append(index)
如果您不关心索引,您可以使用
集合

distinct_names = set(map(lambda search: search["name"], search_list))
这是搜索列表的一次遍历,需要非常量空间


然后,您可以在
人员
s列表上迭代,探测
dict
set
中的姓名。这通常是一个恒定的时间操作。因此,对于与
排序列表
中的不同键数成比例的空间价格(如果您使用集合;否则它与条目数成比例,因为您将存储索引),您现在可以在与
个人列表
中的条目数成比例的时间内执行检查(而不是与
n*m
成比例的时间量).

而且因为我可以即时访问列表中的键,所以我不必在整个列表中循环,对吗?谢谢你的解释,我的两个选项都是一样的。是的:像某些dict中的
键或某些集合中的
键这样的检查通常是一个固定时间操作。和(对于Python特定的上下文).这是一种常见的技术,但我找不到好的复制品。
distinct_names = set(map(lambda search: search["name"], search_list))