我想在python中创建一个对象,该对象是大约200,000,000个真/假值的集合。因此,我可以最有效地更改或回忆任何给定的真/假值,以便我可以快速确定是否有任何给定的数字,如123,456,000是真还是假或更改其值。
这是列表的最佳方法吗?还是阵列?还是上课?或者只是使用位操作的长整数?或其他什么?
我有点菜鸟,所以你可能不得不为我拼出更多的东西,而不是我用其他一种我更了解的语言提问。请举例说明如何操作此对象。
由于
答案 0 :(得分:12)
答案 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
类兼容。