生成一组类似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转换为字符串并测试该集合的成员资格。但这似乎有点麻烦。有更好的解决方案吗?
答案 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定义相等性,也不知道它们是否应该是可以清除的,但似乎它以不兼容的方式实现了相等和散列。