检查对象是否已列入列表(Python)

时间:2015-05-23 01:44:29

标签: python

我尝试在网上搜索这个,但遗憾的是到目前为止还没有找到解决方案,所以我希望有人能够帮助我。我的基本问题是如何检查对象是否已经在列表中?

我目前正在研究一个Rubik的立方体求解器,并创建了一个名为MyCube的类,其中每个对象都有4个属性:

def __init__(self, cp=None, co=None, ep=None, eo=None):

有许多方法可以更改属性,我还为__eq____ne__创建了如下方法:

def __eq__(self, other):
    if type(other) is type(self):
        return self.__dict__ == other.__dict__
    return False

def __ne__(self, other):
    return not self.__eq__(other)

我有一个多维数据集MyMoveCube = [MyCube() for i in range(18)]列表,每个多维数据集都经历了各种不同的转换。然后,我有另一个多维数据集MyNewCube,我想检查它是否已经在MyMoveCube,如果没有,请将其添加到列表中。

我尝试过以下操作,但我发现随着MyMoveCube的大小增加,这会很快变慢:

for current_move in MyMoveCube:
    if current_move == MyNewCube:
        break
    MyMoveCube.append(MyNewCube)

我的问题是,有没有更好的方法来做到这一点,而不是每次循环它?

2 个答案:

答案 0 :(得分:1)

如果MyNewCube已经在MyMoveCube

,您想要做某事
if MyNewCube in MyMoveCube:
    do_whatever()

或者如果你想做某事,如果它不是,

if MyNewCube not in MyMoveCube:
    do_whatever()

(我最初没有看到关于遇到速度问题的部分;这个答案只是演示in语法。测试遏制列表的速度非常慢;为了提高效率,请参阅其他答案。)

答案 1 :(得分:1)

  

“但我发现随着MyMoveCube的大小增加,这会变得很慢”

您需要考虑使用一个集来存储MyCube个实例。

MyMoveCube = set([MyCube() for i in range(18)])

散列一个对象并检查它是否在set是一个非常有效的操作 - 平均情况下O(1)与列表的平均情况下的O(n)相比。

您仍然可以使用相同的in运算符来设置,查找速度更快:

if MyNewCube in MyMoveCube:
    # in cube

修改

如果您需要跟踪集合中项目的顺序,则可以使用setlist。用于跟踪订单的列表和用于测试成员资格的集合。