Python 位数组集
Python bitarray set
生成一组类似位数组的对象的最佳方法是什么,以便我可以有效地测试成员资格。天真的方式似乎并没有像我预期的那样工作:
>>> 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:
The only required property is that objects which compare equal have the same hash value
这意味着位数组实际上是不可散列的,并且不能可靠地在集合中或作为字典键工作。
我认为这是位数组库中的错误。我以前从未听说过 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
不保持散列不变量:
>>> x = bitarray(b'0000')
>>> y = bitarray(b'0000')
>>> x == y
True
>>> hash(x) == hash(y)
False
这违反了 __hash__
的 API,因为 documented:
The only required property is that objects which compare equal have the same hash value
这意味着位数组实际上是不可散列的,并且不能可靠地在集合中或作为字典键工作。
我认为这是位数组库中的错误。我以前从未听说过 bitarray,而且它似乎没有太多文档。据我所知,它甚至没有说明应该如何为位数组定义相等性,也没有说明它们是否应该是可哈希的,但它似乎以不兼容的方式实现了相等性和哈希。