Python比特阵集

时间:2015-04-19 02:36:13

标签: python set bitarray

生成一组类似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转换为字符串并测试该集合的成员资格。但这似乎有点麻烦。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:5)

bitarray似乎没有维护散列不变量:

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

这违反了__hash__的API,documented

  

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

这意味着bitarrays实际上是不可删除的,并且无法在集合或字典键中可靠地工作。

我认为这是bitarray库中的一个错误。我之前从未听说过bitarray,它似乎没有太多的文档。据我所知,它甚至没有说明如何为bitarray定义相等性,也不知道它们是否应该是可以清除的,但似乎它以不兼容的方式实现了相等和散列。