2012-04-25 9 views

答えて

2

まず、カスタムオブジェクトのセットを作成するときは、this questionとその回答を参照する必要があります。 setできるだけでなく

class Foo: 
    def __init__(self, value=0): 
     self.value = value 
    def __hash__(self): 
     return self.value 
    def __eq__(self, other): 
     return isinstance(other, Foo) and self.value == other.value 

は今、あなたはオブジェクトを比較することができ、そして:簡単に言えば、あなたがセットに追加することができるような__hash__()__eq__()などのメソッドを定義する必要があります

In [19]: a = Foo() 

In [20]: b = Foo() 

In [21]: c = Foo(1) 

In [22]: a == b 
Out[22]: True 

In [23]: b == c 
Out[23]: False 

In [24]: s = set([a, b, c]) 

In [25]: s 
Out[25]: 
set([<__main__.Foo instance at 0x267f758>, 
    <__main__.Foo instance at 0x267f950>]) 

In [26]: s.add(Foo()) 

In [27]: s 
Out[27]: 
set([<__main__.Foo instance at 0x267f758>, 
    <__main__.Foo instance at 0x267f950>]) 

問題がある、あなたはまだセットに完全に異なる何かを追加することができます

In [28]: s.add(1) 

In [29]: s 
Out[29]: 
set([<__main__.Foo instance at 0x267f758>, 
    <__main__.Foo instance at 0x267f950>, 
    1]) 

一つの方法は、を上書きすることであろう方法のをご提案ください:

In [30]: class FooSet(set): 
    ....:  def add(self, elem): 
    ....:   if isinstance(elem, Foo): 
    ....:    set.add(self, elem) 
    ....:   else: 
    ....:    raise TypeError('%s is not a Foo' % elem) 
    ....:    # or just put "pass" here for silent behavior 

In [31]: s = FooSet([a, b, c]) 

In [32]: s 
Out[32]: 
set([<__main__.Foo instance at 0x267f758>, 
    <__main__.Foo instance at 0x267f950>]) 

In [33]: s.add(Foo()) 

In [34]: s 
Out[34]: 
set([<__main__.Foo instance at 0x267f758>, 
    <__main__.Foo instance at 0x267f950>]) 

In [35]: s.add(Foo(2)) 

In [36]: s 
Out[36]: 
set([<__main__.Foo instance at 0x267f758>, 
    <__main__.Foo instance at 0x267f950>, 
    <__main__.Foo instance at 0x26808c0>]) 

In [37]: s.add(2) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 

... 

TypeError: 2 is not a Foo 
関連する問題