Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何在python中快速检查对象是否在列表中_Python 2.7_Python - Fatal编程技术网

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

Python 2.7 如何在python中快速检查对象是否在列表中,python-2.7,python,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 虽然这种方法可行,但当主对象列表有100.000个元素时, 它走得非常慢 我的

我有一张物品清单,每一件都是一样的

每个对象都有自己的对象列表(通常只有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
虽然这种方法可行,但当主对象列表有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属性,顺便说一句,事实并非如此 优雅地使用可能已在其他函数中设置/未设置的标志 (如果在使用相同函数的父函数体中调用此函数 标记机制,这会搞乱一切,设置每个对象(标记)

有没有更正确的pythonnesque方法来快速检查对象是否处于活动状态
主对象列表?

如果要使用自己的标志,可以执行以下操作:

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'):
否则,
设置。交叉点
将以最快的速度:

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_列表中的每个对象,并且顺序正确,不是吗?你真的需要为每一对主对象列表做点什么,比如说大约10.000.000.000次?那怎么可能更快呢?在Python2.6及更高版本中,一直到Python2.3中,每个对象都是可散列且唯一的,列表实际上是这个观点下的一个集合。我试着使用set(和dict)。它跑得更快,但我的速度只有10-15%。我不需要按照特定的顺序处理每个列表,但我没有尝试set.intersection(或set&set),只是认为它不会比'in'@user815129更快,它在s中一次执行大量的
,在C中,而不会返回到Python级别。它应该更快。@user815129另一种可能是使用您自己的标志;请参阅我的编辑。
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)