Python比特阵集

God*_*del 1 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
Run Code Online (Sandbox Code Playgroud)

解决方法是将一组单独的字符串或其他更友好的对象保存为键.然后将bitarray转换为字符串并测试该集合的成员资格.但这似乎有点麻烦.有更好的解决方案吗?

Bre*_*arn 5

似乎bitarray不保持哈希不变量:

>>> x = bitarray(b'0000')
>>> y = bitarray(b'0000')
>>> x == y
True
>>> hash(x) == hash(y)
False
Run Code Online (Sandbox Code Playgroud)

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

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

这意味着比特阵列实际上是不可用的,并且不能在集合中可靠地工作或作为字典键.

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