Python的bitarray集(Python bitarray set)

2019-09-28 18:05发布

什么是生成一组bitarray状物体,这样我可以有效地测试成员的最佳途径。 用简单的方式似乎并不如我所料的工作:

>>> from bitarray import bitarray
>>> 
>>> bitarray_set = set([bitarray('0000'), bitarray('0001')])
>>> bitarray_set
set([bitarray('0001'), bitarray('0000')])
>>> 
>>> bitarray('0000') in bitarray_set
False

一种解决方法是保持一个独立的组字符串或其它更友好的对象键。 然后,bitarray转换为对这个集合,而不是字符串和测试的成员。 但是,这似乎有点麻烦。 有没有更好的解决办法?

Answer 1:

看来, bitarray不维护哈希不变:

>>> x = bitarray(b'0000')
>>> y = bitarray(b'0000')
>>> x == y
True
>>> hash(x) == hash(y)
False

这是一个违规的API __hash__ ,为记录 :

唯一需要的属性是它比较相等的对象具有相同的哈希值

这意味着bitarrays是有效unhashable并且不会在集合或字典的键可靠地工作。

我会认为这是在bitarray库中的缺陷。 我从来没有听说过bitarray之前,它似乎并没有那么多的文档。 至于我可以看到,它甚至不说平等应该是怎样的bitarrays进行定义,也无论他们是应该是哈希的,但似乎它实现平等和不兼容的方式散列。



文章来源: Python bitarray set