首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比较对象列表和数据集列表

比较对象列表和数据集列表
EN

Stack Overflow用户
提问于 2021-03-27 20:41:41
回答 1查看 106关注 0票数 2

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

我有一个包含对象的列表,还有第二个包含数据集的列表。两者都有名字。我想比较一下两个列表中是否都包含了一个名称。

具有对象的列表的类。

代码语言:javascript
运行
复制
class Person():
def __init__(self, name):
    self.name = name

为示例创建两个列表

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
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创建一个新列表,它只包含在此列表中搜索之前的名称。

代码语言:javascript
运行
复制
for search in search_list:
    if search["name"] in names:
        print(search["name"] + " found")
        names.remove(search["name"])
    else:
        print(search["name"] + " not found")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-27 20:57:29

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

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

代码语言:javascript
运行
复制
from collections import defaultdict

names_to_indices = defaultdict(list)

for index, search in enumerate(search_list):
    names_to_indices[search["name"]].append(index)

如果您不关心索引,则只需使用set

代码语言:javascript
运行
复制
distinct_names = set(map(lambda search: search["name"], search_list))

这是对搜索列表的一次传递,需要非常量空间.

然后,您可以遍历Person的列表,搜索dictset的名称。这通常是一个固定时间的操作.因此,对于空间的价格与sort_list中不同键的数量成正比(如果您使用一个集合;否则它与条目的数量成正比,因为您将存储索引),您现在可以在与person_list中的条目数量成正比的时间内执行检查(而不是在与n * m成比例的时间内)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66835887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档