我尝试在网上搜索这个,但遗憾的是到目前为止还没有找到解决方案,所以我希望有人能够帮助我。我的基本问题是如何检查对象是否已经在列表中?
我目前正在研究一个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)
我的问题是,有没有更好的方法来做到这一点,而不是每次循环它?
答案 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
修改强>
如果您需要跟踪集合中项目的顺序,则可以使用set
和list
。用于跟踪订单的列表和用于测试成员资格的集合。