我有一个对象列表(Foo)。Foo 对象有几个属性。一个 Foo 对象的实例等价于(等于)另一个 Foo 对象的实例,当且仅当当且仅当所有属性都相等。
我有以下代码:
class Foo(object):
def __init__(self, myid):
self.myid=myid
def __eq__(self, other):
if isinstance(other, self.__class__):
print 'DEBUG: self:',self.__dict__
print 'DEBUG: other:',other.__dict__
return self.__dict__ == other.__dict__
else:
print 'DEBUG: ATTEMPT TO COMPARE DIFFERENT CLASSES:',self.__class__,'compared to:', other.__class__
return False
import copy
f1 = Foo(1)
f2 = Foo(2)
f3 = Foo(3)
f4 = Foo(4)
f5 = copy.deepcopy(f3) # overkill here (I know), but needed for my real code
f_list = [f1,f2,f3,f4,f5]
# Surely, there must be a better way? (this dosen't work BTW!)
new_foo_list = list(set(f_list))
在处理简单类型(int、float、string - 以及令人惊讶的 datetime.datetime 类型)时,我经常使用上面的这个小(反?)“模式”(转换为 set 和 back),但它已经有了更多涉及的数据类型 - 就像上面的 Foo 一样。
那么,我如何将上面的列表 f1 更改为唯一项目列表 - 而不必遍历每个项目并检查它是否已经存在于某些临时缓存等中?
最pythonic的方法是什么?