Python Arrays
Lerne, wie du Python-Arrays mit dem array-Modul erstellst und verwendest: Typecodes, Indizierung, Slicing, Mutationen und wann Arrays sinnvoller als Listen sind.
Dieses Kapitel behandelt Pythons eingebautes array-Modul, das eine kompakte, typbeschränkte Sequenz zur Speicherung homogener numerischer Daten bereitstellt. Du lernst, was Typecodes sind, wie du Arrays erstellst und indizierst, wie du sie mit der vollständigen Menge verfügbarer Methoden veränderst — und vor allem, wann ein array die bessere Wahl gegenüber einer einfachen Python-Liste ist.
Was ist das array-Modul?
Pythons array-Modul stellt einen Sequenztyp bereit, der Elemente eines einzigen C-kompatiblen numerischen Typs speichert. Im Gegensatz zu einer Liste, die beliebige Objekte enthalten kann, speichert jeder Platz in einem array genau denselben primitiven Werttyp (eine ganze Zahl, eine Gleitkommazahl usw.). Diese Einschränkung macht Arrays für große Zahlensammlungen speichereffizienter als Listen.
Wichtige Punkte:
- Im Standard-Bibliothek enthalten — keine Installation erforderlich.
- Alle Elemente müssen denselben Typecode teilen (ein einzelnes Zeichen, das den C-Typ identifiziert).
- Unterstützt standardmäßige Sequenzoperationen: Indizierung, Slicing, Iteration,
len()und Mitgliedschaftstests mitin. - Nützlich, wenn du kompakten Speicher benötigst, ohne auf eine Drittanbieterbibliothek wie NumPy zurückgreifen zu müssen.
Wenn du bereits mit Python-Listen vertraut bist, stelle dir ein array als Liste vor, die Flexibilität gegen Speichereffizienz eintauscht.
Typecodes
Jedes array wird mit einem Typecode erstellt — einem einstelligen string, der Python mitteilt, welchen C-Typ für jedes Element verwendet werden soll und damit, wie viele Bytes jeder Platz belegt.
| Typecode | C-Typ | Mindestgröße in Bytes | Typische Verwendung |
|---|---|---|---|
'b' | signed char | 1 | Kleine ganzzahlige Werte −128 bis 127 |
'B' | unsigned char | 1 | Kleine nicht-negative ganzzahlige Werte 0–255 |
'h' | signed short | 2 | Mittlere ganzzahlige Werte |
'H' | unsigned short | 2 | Mittlere nicht-negative ganzzahlige Werte |
'i' | signed int | 2 | Allgemeine ganzzahlige Werte (meist 4 Bytes) |
'I' | unsigned int | 2 | Nicht-negative ganzzahlige Werte |
'l' | signed long | 4 | Größere ganzzahlige Werte |
'L' | unsigned long | 4 | Größere nicht-negative ganzzahlige Werte |
'q' | signed long long | 8 | Sehr große ganzzahlige Werte |
'Q' | unsigned long long | 8 | Sehr große nicht-negative ganzzahlige Werte |
'f' | float | 4 | Einfachgenaue Gleitkommazahl |
'd' | double | 8 | Doppeltgenaue Gleitkommazahl |
Die tatsächliche Bytegröße kann je nach Plattform variieren. Verwende array.itemsize, um sie zur Laufzeit zu prüfen.
Hinweis zu
'u'(Unicode-Zeichen): Dieser Typecode wurde in Python 3.3 als veraltet markiert und in Python 3.13 entfernt. Verwende ihn nicht in neuem Code — nutze stattdessenstroderbytes.
Arrays erstellen
Importiere das Modul und rufe array.array(typecode, initializer) auf, wobei initializer ein beliebiges Iterable mit Werten ist, die zum gewählten Typecode kompatibel sind.
import array as arr
# Array of signed integers
int_array = arr.array('i', [1, 2, 3, 4, 5])
print(int_array) # array('i', [1, 2, 3, 4, 5])
# Array of double-precision floats
float_array = arr.array('d', [1.1, 2.2, 3.3])
print(float_array) # array('d', [1.1, 2.2, 3.3])
# Inspect the typecode and bytes-per-element
print(int_array.typecode) # i
print(int_array.itemsize) # 4 (platform-dependent)Du kannst auch ein leeres array erstellen und es später befüllen:
import array as arr
empty = arr.array('i') # empty integer array
empty.append(10)
empty.append(20)
print(empty) # array('i', [10, 20])Auf Array-Elemente zugreifen
Die Indizierung von Arrays funktioniert genau wie die Listenindizierung: nullbasiert von links, und negative Indizes zählen von rechts.
Der Zugriff auf einen Index außerhalb des gültigen Bereichs löst einen IndexError aus, genau wie bei Listen.
Arrays slicen
Slicing gibt ein neues array mit demselben Typecode zurück, das die ausgewählten Elemente enthält. Die Syntax lautet a[start:stop:step] — dieselbe wie für Listen und Strings.
Über ein Array iterieren
Du kannst mit einer for-Schleife über ein array iterieren oder mit in auf Mitgliedschaft prüfen:
import array as arr
a = arr.array('i', [10, 20, 30, 40, 50])
for item in a:
print(item, end=' ')
# Output: 10 20 30 40 50
print()
print(30 in a) # True
print(99 in a) # False
print(len(a)) # 5Arrays verändern
Arrays sind veränderbar — du kannst Elemente nach der Erstellung ändern, hinzufügen und entfernen.
Ein Element ändern
Weise einem Index direkt einen neuen Wert zu:
Elemente hinzufügen
Verwende append(), um ein einzelnes Element am Ende hinzuzufügen, oder extend(), um mehrere Elemente aus einem beliebigen Iterable hinzuzufügen:
Verwende insert(index, value), um ein Element an einer bestimmten Position einzufügen:
import array as arr
a = arr.array('i', [1, 2, 3, 4, 5])
a.insert(2, 10) # insert 10 before index 2
print(a) # array('i', [1, 2, 10, 3, 4, 5])Elemente entfernen
remove(value) löscht das erste Vorkommen des angegebenen Werts und löst ValueError aus, wenn er nicht gefunden wird:
pop(index) entfernt und gibt das Element bei index zurück (standardmäßig das letzte Element):
import array as arr
a = arr.array('i', [1, 2, 3, 4, 5])
last = a.pop() # removes and returns 5
print(last) # 5
print(a) # array('i', [1, 2, 3, 4])
second = a.pop(1) # removes and returns element at index 1
print(second) # 2
print(a) # array('i', [1, 3, 4])Suchen und Zählen
index(value) gibt den Index des ersten Vorkommens von value zurück (löst ValueError aus, wenn nicht vorhanden):
import array as arr
a = arr.array('i', [10, 20, 30, 20, 40])
print(a.index(20)) # 1 — first occurrence
print(a.index(30)) # 2count(value) gibt zurück, wie oft value vorkommt:
import array as arr
a = arr.array('i', [1, 2, 2, 3, 2, 4])
print(a.count(2)) # 3
print(a.count(9)) # 0Ein Array umkehren
reverse() kehrt das array in-place um:
import array as arr
a = arr.array('i', [1, 2, 3, 4, 5])
a.reverse()
print(a) # array('i', [5, 4, 3, 2, 1])Konvertierung zwischen Arrays und Listen
tolist() konvertiert ein array in eine Standard-Python-Liste. Für die umgekehrte Richtung übergib eine Liste an array.array():
import array as arr
a = arr.array('i', [1, 2, 3, 4, 5])
# array → list
my_list = a.tolist()
print(my_list) # [1, 2, 3, 4, 5]
print(type(my_list)) # <class 'list'>
# list → array
back = arr.array('i', my_list)
print(back) # array('i', [1, 2, 3, 4, 5])Den Elementtyp ändern
Das Attribut typecode ist schreibgeschützt. Um dieselben Werte unter einem anderen Typ zu speichern, erstelle ein neues array und verwende das ursprüngliche als Initializer:
Speichereffizienz: Arrays vs. Listen
Der wichtigste praktische Grund, das array-Modul statt einer Liste zu verwenden, ist der Speicher. Eine Liste speichert Referenzen auf Python-Objekte; ein array speichert die rohen C-Werte direkt.
import array as arr
import sys
n = 1000
my_list = list(range(n))
my_array = arr.array('i', range(n))
print('List size:', sys.getsizeof(my_list), 'bytes')
print('Array size:', sys.getsizeof(my_array), 'bytes')
# Example output (64-bit platform):
# List size: 8056 bytes
# Array size: 4096 bytesBei großen Datensätzen (Hunderttausende von ganzen Zahlen) summieren sich die Einsparungen erheblich. Wenn du noch mehr Leistungsfähigkeit benötigst — vektorisierte Mathematik, mehrdimensionale Arrays — ziehe NumPy in Betracht.
Wann Arrays vs. Listen verwenden
Verwende das array-Modul, wenn:
- Du eine große Anzahl homogener numerischer Werte speicherst (Sensormesswerte, Pixeldaten, Netzwerkpuffer usw.).
- Der Speicherverbrauch ein Problem ist und du keine Drittanbieterbibliothek verwenden kannst.
- Du aus Binärdateien oder Netzwerk-Sockets liest oder in diese schreibst (die Methoden
tofile()/fromfile()machen das unkompliziert).
Bleib bei Python-Listen, wenn:
- Du gemischte Typen oder beliebige Objekte speichern musst.
- Die Sammlung klein ist und Speicher kein Problem darstellt.
- Du umfangreiche Listenmethoden benötigst, wie
sort()mit einer Schlüsselfunktion.
Verwende NumPy, wenn:
- Du mathematische Operationen auf ganzen Arrays benötigst (vektorisierte Arithmetik, Matrizenalgebra, Statistik).
- Du mit mehrdimensionalen Daten arbeitest.
Methodenreferenz
| Methode | Beschreibung |
|---|---|
append(x) | x am Ende des Arrays hinzufügen |
extend(iterable) | Alle Elemente aus iterable am Ende hinzufügen |
insert(i, x) | x vor Index i einfügen |
remove(x) | Das erste Vorkommen von x entfernen |
pop([i]) | Element bei Index i entfernen und zurückgeben (Standard: letztes) |
index(x) | Den Index des ersten Vorkommens von x zurückgeben |
count(x) | Die Anzahl der Vorkommen von x zurückgeben |
reverse() | Das array in-place umkehren |
tolist() | Das array in eine Python-Liste konvertieren |
tofile(f) | Alle Elemente als Maschinenwerte in das offene Dateiobjekt f schreiben |
fromfile(f, n) | n Elemente aus dem Dateiobjekt f lesen und an das array anhängen |