生成一组类似位数组的对象的最佳方法是什么,以便我可以高效地测试成员资格。天真的方式似乎不符合我的预期:

>>> 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不能保持哈希不变:

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


这违反了__hash__的API,例如documented


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


这意味着位数组实际上是不可哈希的,并且不能在集合中或作为字典键可靠地工作。

我将其视为bitarray库中的错误。我以前从未听说过bitarray,而且似乎没有太多的文档。据我所知,它甚至都没有说应该如何为位数组定义相等性,也没有说它们是否应该是可哈希的,但似乎它以不兼容的方式实现了相等和哈希。

关于python - Python位数组集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29725176/

10-09 07:24