当 Python 取两个集合的交集时,它总是从较小的集合返回元素,这在几乎所有情况下都是合理的,但我试图做相反的事情。
在下面的代码中,请注意交集产生一个整数,而不是浮点数。
[in] >>> x = {1.0,2.0,3.0}
[in] >>> y = {1}
[in] >>> x.intersection(y)
[out] >>> {1}
[in] >>> y.intersection(x)
[out] >>> {1}
如果我想得到一个浮点数,我必须使用一些繁重的复制。
[in] >>> x - y
[out] >>> {2.0,3.0}
[in] >>> x - (x - y)
[out] >>> {1.0}
我正在处理比上面的例子更大的集合。我的问题是是否有任何方法可以欺骗 Python set.intersection 方法从更大的集合中返回元素,或者除了我在这里所做的之外,是否还有另一种方法可以返回 float 1.0。
我首先这样做的原因是我试图通过对frozenset 进行子类化来在纯python 中实现一个冻结字典。我使用元组的子类存储键值对,我称之为“项目”,其中哈希仅返回键的哈希。使用下面的代码,我可以创建一个包含单个键值对的集合。然后我提取属性“值”并返回它。
def __getitem__(self, key):
wrapped = Item((key,),flag=False)
if not frozenset.__contains__(self, wrapped):
raise KeyError(key)
matches = self - (self - {wrapped})
for pair in frozenset.__iter__(matches):
return pair.value
我知道复制是缓慢的原因,因为当我尝试返回一个其键不在字典中的项目时,我立即得到一个 KeyError,即使对于具有 1000 万个项目的集合也是如此。