Python中非常大的布尔列表

时间:2009-10-16 19:21:28

标签: python arrays list

我想在python中创建一个对象,该对象是大约200,000,000个真/假值的集合。因此,我可以最有效地更改或回忆任何给定的真/假值,以便我可以快速确定是否有任何给定的数字,如123,456,000是真还是假或更改其值。

这是列表的最佳方法吗?还是阵列?还是上课?或者只是使用位操作的长整数?或其他什么?

我有点菜鸟,所以你可能不得不为我拼出更多的东西,而不是我用其他一种我更了解的语言提问。请举例说明如何操作此对象。

由于

6 个答案:

答案 0 :(得分:12)

您可以尝试使用bitarray模块,或者自己使用array整数编写类似的内容。

答案 1 :(得分:4)

“快速确定任何给定的数字,如123,456,000是否为”真实“设置或”假“设置。

这是set的用途。

“true”集是一组所有数字。

要使数字的布尔标志为“true”,请将其添加到真实集合中。

要使数字的布尔标志为“false”,请将其从真实集中删除。

生活将变得更加简单。

答案 2 :(得分:3)

您是否考虑使用像SQLite这样的轻量级数据库?

答案 3 :(得分:3)

您可能还想尝试bitstring模块,它是纯Python。在内部,它全部存储为字节数组,并为您完成位屏蔽和移位:

from bitstring import BitArray
# Initialise with two hundred million zero bits
s = BitArray(200000000)
# Set a few bits to 1
s.set(1, [76, 33, 123456000])
# And test them
if s.all([33, 76, 123456000]):
    pass

其他海报是正确的,但一个简单的集合可能是解决您的特定问题的更好方法。

答案 4 :(得分:1)

乍一看,Python BitVector模块听起来就像它完全符合您的要求。它可以在http://cobweb.ecn.purdue.edu/~kak/dist/BitVector-1.5.1.html获得,因为它是纯Python代码,所以它可以在任何平台上运行而无需编译。

您提到需要一些速度来获取和设置任意的true-false值。为此,您需要使用Python数组而不是列表,如果您转到上面的URL并浏览BitVector的源代码,您会发现它确实依赖于Python数组。

理想情况下,您可以在BitVector的子类中封装您正在执行的操作,即

class TFValues(BitVector):
   pass

通过这种方式,您可以执行添加列表以包含相关信息(例如特定TF值的名称)的操作。

答案 5 :(得分:0)

如果设置的位大部分是连续的,则还可以选择存储范围列表,例如PyPI模块https://pypi.org/project/range_set/,该API与Python的set类兼容。