Ich brauche eine kompakte Darstellung eines Arrays von Booleschen, hat Python eine eingebaute Bitfeld-Typ oder muss ich eine alternative Lösung zu finden?
Antworten
Zu viele Anzeigen?Das BitVector-Paket könnte genau das Richtige für Sie sein. Es ist nicht in meine Python-Installation integriert, aber auf der Python-Website leicht zu finden.
https://pypi.python.org/pypi/BitVector für die aktuelle Version.
NumPy hat eine Array-Schnittstelle Modul, das Sie zur Erstellung eines Bitfelds verwenden können.
Wenn Ihr Bitfeld kurz ist, können Sie wahrscheinlich das Strukturmodul . Andernfalls würde ich eine Art von Wrapper um die das Array-Modul .
Außerdem enthält das Modul ctypes Bitfelder aber ich habe es selbst nie benutzt. Ausschluss der Öffentlichkeit .
Ich brauchte ein minimales, speichereffizientes Bitfeld ohne externe Abhängigkeiten, hier ist es:
import math
class Bitfield:
def __init__(self, size):
self.bytes = bytearray(math.ceil(size / 8))
def __getitem__(self, idx):
return self.bytes[idx // 8] >> (idx % 8) & 1
def __setitem__(self, idx, value):
mask = 1 << (idx % 8)
if value:
self.bytes[idx // 8] |= mask
else:
self.bytes[idx // 8] &= ~mask
使用する:
# if size is not a multiple of 8, actual size will be the next multiple of 8
bf = Bitfield(1000)
bf[432] # 0
bf[432] = 1
bf[432] # 1
Wenn Sie ints (oder long ints) als Arrays von bools (oder als Sets von Integers) darstellen wollen, werfen Sie einen Blick auf http://sourceforge.net/projects/pybitop/files/
Es ermöglicht das Einfügen/Extrahieren von Bitfeldern in lange Ints; das Finden des höchst- oder niedrigstwertigen '1'-Bits; das Zählen aller 1en; Bit-Umkehrung; solche Dinge, die alle in reinem Python möglich sind, aber in C viel schneller.