1

嗨,大家好!

我有一个小问题,我无法口头解释这个问题,所以我将尝试用代码说明它:

class move(object):
    def __init__(self, number):
        self.number = number

list1 = [move(1), move(2), move(3), move(4)]
list2 = [move(3), move(7)]

list1.remove(list2[0])

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    list1.remove(list2[0])
ValueError: list.remove(x): x not in list

如您所见,list1[2] 和 list2[0] 都派生自同一个类,并且具有完全相同的属性,它们只是该类的两个不同实例

这个问题的最佳解决方案是什么?

非常感谢您的帮助!

4

3 回答 3

5

你应该重写__eq__你的类来告诉 Python 如果它们的数量相等,两个类是相等的:

class move(object):
    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        return self.number == other.number
于 2012-10-08T09:50:00.820 回答
0

如果你关心性能,你可以使用这种情况:

class move(int):
    pass # you can add new attrs and methods 


list1 = [move(1), move(2), move(3), move(4)]
list2 = [move(3), move(7)]

list1.remove(list2[0])

print list1 # [1, 2, 4]
于 2012-10-08T10:01:12.803 回答
0

如果您的Move数据类型将是不可变的,那么您最好使用namedtuple非常简洁的定义,并且您可以获得免费的相等实现。

>>> from collections import namedtuple
>>> Move = namedtuple('Move', 'number')
>>> list1 = [Move(2), Move(3), Move(7)]
>>> list2 = [Move(3), Move(7)]
>>> 
>>> list1.remove(list2[0])
>>> list1
[Move(number=2), Move(number=7)]
于 2012-10-08T11:32:08.820 回答