我是Python新手,我有两个解决方案来解决我的问题,但我想知道这是否是正确的方法,还是有更聪明的解决方案?
我有一个包含对象的列表,还有第二个包含数据集的列表。两者都有名字。我想比较一下两个列表中是否都包含了一个名称。
具有对象的列表的类。
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选项a对我来说似乎效率很低,因为它在search_list的每一次迭代中都会遍历整个search_list。
for search in search_list:
if [p for p in person_list if p.name == search["name"]]:
print(search["name"] + " found")
else:
print(search["name"] + " not found")我不想从person_list中删除一些东西来缩短迭代时间,因为我稍后会重用它。
选项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")发布于 2021-03-27 20:57:29
这两种方法每次都必须扫描整个列表(这就是x in some_list在person_list循环中所做的)。
我要做的是先遍历名称列表,构建索引名称的dict。
from collections import defaultdict
names_to_indices = defaultdict(list)
for index, search in enumerate(search_list):
names_to_indices[search["name"]].append(index)如果您不关心索引,则只需使用set:
distinct_names = set(map(lambda search: search["name"], search_list))这是对搜索列表的一次传递,需要非常量空间.
然后,您可以遍历Person的列表,搜索dict或set的名称。这通常是一个固定时间的操作.因此,对于空间的价格与sort_list中不同键的数量成正比(如果您使用一个集合;否则它与条目的数量成正比,因为您将存储索引),您现在可以在与person_list中的条目数量成正比的时间内执行检查(而不是在与n * m成比例的时间内)。
https://stackoverflow.com/questions/66835887
复制相似问题