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] はどちらも同じクラスから派生し、まったく同じ属性を持っています。これらは、このクラスの 2 つの異なるインスタンスにすぎません。

この問題の最適な解決策は何ですか?

ご助力ありがとうございます!

4

3 に答える 3

5

クラスの をオーバーライドして__eq__、数値が等しい場合に 2 つのクラスが等しいことを 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データ型が不変になる場合は、定義が非常に簡潔な which を使用する方が適切で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 に答える