gpt4 book ai didi

python-2.7 - 如何快速检查一个对象是否在Python列表中

转载 作者:行者123 更新时间:2023-12-01 06:01:29 25 4
gpt4 key购买 nike

我有一个对象列表,每个对象都是同一类型。

每个对象都有自己的对象列表(通常只有 5-10 个项目)

我以前做的是:

for o in main_object_list:
obj_list = o.get_this_object_list()
for i in obj_list:
if i in main_object_list:
//do something with i

虽然这种方法有效,但当 main_object_list 有 100.000 个元素时,它进展得非常慢。

我的解决方法是这样的:

for o in main_object_list:
o.flag = True

for o in main_object_list:
obj_list = o.get_this_object_list()
for i in obj_list:
if i.flag:
//do something with i

速度快了几个数量级(从 22 分钟缩短到 17 秒)但我怀疑可能有一种不同的、更好的方法。此外,这个例子之所以有效,是因为每个对象都有一个 flag 属性,顺便说一句,事实并非如此优雅地使用可能已在其他函数中设置/取消设置的标志(如果在使用相同的父函数的主体中调用该函数标志机制,这会搞乱一切,设置每个对象标志)

是否有更正确的Python式方法来快速检查对象是否在主要_对象_列表?

最佳答案

如果你想使用自己的标志,你可以这样做:

for o in main_object_list:
o.my_special_flag = True

for o in main_object_list:
obj_list = o.get_this_object_list()
for i in obj_list:
if hasattr(i, 'my_special_flag'):

否则set.intersection会尽可能快:

main_object_set = set(main_object_list)

for o in main_object_list:
obj_list = o.get_this_object_list()
objs_in_main_list = main_object_set.intersection(obj_list)
for i in objs_in_main_list:
//do something with i

或者:

main_object_set = set(main_object_list)

objs_in_main_list = set().update(
*(o.get_this_object_list() for o in main_object_list))
objs_in_main_list.intersection_update(main_object_set)

关于python-2.7 - 如何快速检查一个对象是否在Python列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10221538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com