返回信息流或者怎么修支持改set默认的比较方法呢?
来自「北邮人论坛手机版」
这是一条镜像帖。来源:北邮人论坛 / python / #534同步于 2014/6/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
python 有object element 的set的实现么?
hongbaoshu
2014/6/1镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
你说的__eq__的element的函数吧,有没有像Java一样可以替换set自己的comparison方法
【 在 tonicbupt 的大作中提到: 】
: 完全没有懂... set 里的比较是调用eq的啊, 你可以自己实现 __eq__, __hash__, 这样的方法...
【 在 hongbaoshu 的大作中提到: 】
: 你说的__eq__的element的函数吧,有没有像Java一样可以替换set自己的comparison方法
没有, 你可以装个IPython, 输入 `set?` 就可以看到.
可是为什么需要去替换set的比较方法? 如果你是希望 set 里装不同类型的元素同时让他们互相能比较, 那么给所有类型直接实现 __eq__, __hash__ 就可以了, Python 本身是 duck typing 的.
是这样的我有一个class有多个attributes,需要通过重置set的compare把其中一部分重复的对象筛选掉。
class A:
self.a
self.b
self.c
self.d
def compare(one, another):
if (one.b == another.a) and (one.a == another.b):
return True
else
return False
【 在 nuanyangyang 的大作中提到: 】
: 楼主可以说说具体应用场景吗?
: 来自「北邮人论坛手机版」
假如我有两种比较方法,我怎么在element实现中的__eq__做到set1中调用eq1,set2中调用eq2?
【 在 tonicbupt 的大作中提到: 】
:
: 没有, 你可以装个IPython, 输入 `set?` 就可以看到.
: 可是为什么需要去替换set的比较方法? 如果你是希望 set 里装不同类型的元素同时让他们互相能比较, 那么给所有类型直接实现 __eq__, __hash__ 就可以了, Python 本身是 duck typing 的.
不过,考虑一下,如果只有这个比较函数可以知道两个类是否相等,那么,给一个集合去重是O(n^2)的复杂度,因为唯一的比较方法是两两穷举比较。这比起用list没有优势。
【 在 hongbaoshu 的大作中提到: 】
: 是这样的我有一个class有多个attributes,需要通过重置set的compare把其中一部分重复的对象筛选掉。
: class A:
: self.a
: ...................
来自「北邮人论坛手机版」
【 在 hongbaoshu 的大作中提到: 】
: 假如我有两种比较方法,我怎么在element实现中的__eq__做到set1中调用eq1,set2中调用eq2?
这个场景应该是你自己实现俩比较的容器了, 可能set并不适合了. 不考虑内存的话我觉得你用个 `defaultdict(list)` 挺好的, 你的比较方法结果做key, 元素自己做value, 可以得到一个groupby的结果. `dict.setdefault` 也可以是一样的效果.
至于你给的那个 `self.a == other.a and self.b == other.b` 的... 这不就是 def __eq__(self, other): return self.a == other.a and self.b == other.b 么...