0

我有一个 python 对象列表。例如“all_names”我可以通过这种方式从该列表中检索值:

for a in all_names:
    print a.name,a.age

我的目标是快速找出列表 all_names 中是否存在某个名称。

所以我正在这样做。

all = []
for a in all_names:
    all.append(a.name)
if "any_name" in all:
    print "Name exit"
else:
    print "Not found"

但是如果“all_names”的大小非常大(例如,如果 len(all_names) > 100,000),那么我认为这不是一种有效的方法。

所以想知道,是否有比这更有效的方法?

感谢进阶。

4

4 回答 4

1

尝试:

if any(i.name == "any_name" for i in all_names):
    print "Name exists"
else:
    print "Not found"

如果您只需要查找一个名称,这就是方法。如果您需要查找更多名称 - 使用set

names = set(i.name for i in all_names)
if "any_name" in names:
    print "Name exists"
else:
    print "Not found"
于 2013-08-18T17:39:36.573 回答
0

那这个呢:

for i in all_names:
    if i.name == "any_name":
        print("Name found!")
        break
else:
    # The loop wasn't broken out of
    print("Name not found")

或者:

if any(i.name == "any_name" for i in all_names):
    print("Name found!")
else:
    print("Name not found")
于 2013-08-18T17:38:39.053 回答
0

使用一套。

all_set = set(a.name for a in all_names)

if "any_name" in all_set:
    print "Name exists"
else:
    print "Not found"

该集合像字典一样工作,访问时间为 O(1)。当然,要欣赏套装的速度,您需要重复使用它(在同一套装中询问多个名称)。

于 2013-08-18T17:38:55.677 回答
0

all_name在你的代码中创建
all_name={a.name for a in all_names}
一切都很好......


注意:不要使用保留的内置插件(在你的情况下all)名称

于 2013-08-18T17:52:53.453 回答