1

是否可以实现一个类的方法,以便它的对象与 set() 函数一起使用?所以 Set(objarray) 会返回唯一的对象。当然,创建我自己的集合是一种选择,但如果它已经存在,我只是不想重新发明轮子。

编辑:我想我让你们对我的英语感到困惑。这就是我在课堂上所拥有的 - 我有一个 Person 类,其中包含人名和地址作为其成员。这就是我想做的-

persons = []
for i in range (50):
  name = raw_input("Enter Name")
  address = raw_input("Address")
  persons.append(Person(name,address))
unique = Set(persons) #would only return one person from an address. 
                      #The rest from the same address will be removed

我希望清除混乱。

4

1 回答 1

3

是的。首先,如果您的类既不实现__hash__也不实现__eq__,那么它们已经id是可散列的( 用作散列值,比较由 完成is)。

或者,如果您实现__hash__and __eq__,那么您的类实例可以安全地用于集合或字典键:

>>> class Foo:
...     def __init__(self, val): self.val = val
...     def __hash__(self): return hash(self.val)
...     def __eq__(self, other): return self.val == other.val
...     def __repr__(self): return 'Foo(%r)' % self.val
... 
>>> print set([Foo(3), Foo("bar")])
set([Foo(3), Foo('bar')])

如果您希望能够set直接调用您的类的实例,请重载__iter__以使类实例看起来是可迭代的:

>>> class CharSeq:
...     def __init__(self, first, last):
...         self.first = ord(first)
...         self.last = ord(last)
...     def __iter__(self):
...         return (chr(i) for i in xrange(self.first, self.last+1))
... 
>>> set(CharSeq('a', 'c'))
set(['a', 'c', 'b'])
于 2012-10-07T01:39:54.420 回答