如何快速检查对象是否在python中的列表中

时间:2012-04-19 04:12:07

标签: python-2.7 python

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

每个对象都有自己的对象列表(通常只有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属性,顺便说一下它不是这样 优雅地使用可能已在其他功能中设置/未设置的标志 (如果在使用相同功能的父函数体中调用此函数 标志机制,这会弄乱一切,设置每个对象标志)

是否有更正确的pythonesque方式来快速检查对象是否在 main_object_list?

1 个答案:

答案 0 :(得分:2)

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

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)