Python – Arrays & Listen

Der Titel dieses Tutorial ist etwas irritierend, denn in der Programmiersprache Python werden die Begriffe „Arrays“ und „Listen“ in der Regel synonym verwendet. Tatsächlich existieren aber unterschiedliche Datenstrukturen:

  • Listen
  • array.array
  • numpy.array

Die Listen sind Kern-Bestandteil von Python. Für die Arrays, die über die Pakete array und numpy zur Verfügung gestellt werden, müssen hingegen die entsprechenden Pakete importiert werden.

Dieser Blogbeitrag vermittelt einen kurzen Überblick über diese drei Typen.

Arrays (array.array)

Beginnen wir mit Arrays aus dem Paket array, auch wenn dies nicht naheliegend sein mag, schließlich wird in der Praxis primär mit Listen gearbeitet.

Beim Datentyp array.array handelt es sich um einen Wrapper für Arrays der Programmiersprache C. Dieses Array kann nur Elemente gleichen Typs enthalten (zum Beispiel nur Integer- oder Float-Werte).

Im folgenden Beispiel soll ein Array mit zehn Integer-Werten erstellt werden. Im Gegensatz zur Liste, muss dazu ein type code angegeben werden. Hier wird I, für unsigned int verwendet. Eine vollständige Übersicht zu den unterstützten Typen findet sich in der Dokumentation zu den Arrays.

# Das Modul array importieren
from array import array

# Ein Array mit Integer-Werten (unsigned int) erstellen
number_array = array('I', [0, 1, 2, 3, 4])

# Gibt die Anzahl der im Array vorhandenen Elemente aus
print("The length of this array: {0}".format(len(number_array)))

# Zeigt die Elemente des Arrays an
print("The elements of this array:")
for number in number_array:
    print(number)

Wann macht es Sinn diesen Array-Typ zu verwenden? Wie wir noch später sehen werden, ist man mit Listen deutlich flexibler. Dafür benötigen Listen aber auch deutlich mehr Speicherplatz. Der Typ array.array ist hingegen effizienter. In der Praxis kommt er zum Einsatz, wenn man Extensions programmiert, und hierbei ein C-Array verwenden muss.

Arrays (numpy.array)

Jetzt werfen wir einen Blick auf das Paket numpy, mithin den Typ numpy.array. Auch hier erstellen wir zunächst ein Array mit fünf Integer-Werten. Die Elemente sollten gleichen Datentyps sein. Im Gegensatz zu einem Array aus dem Modul array muss hier aber kein type code angegeben werden.

import numpy as np

number_array = np.array([0, 1, 2, 3, 4])
print("Elements of the numpy array: {0}".format(number_array))
[0, 1, 2, 3, 4]

Die Verwendung von Numpy-Arrays bietet sich an, wenn mathematische Operationen im Vordergrund stehen (und man numerische Werte gleichen Typs nutzt).

Es ist zwar möglich, ein numpy-array mit Werten unterschiedlichen Typs zu erstellen, allerdings werden in so einem Fall alle Elemente des Arrays in den Typ numpy.str_ konvertiert, wie folgendes Beispiel zeigt:

values = np.array([10, "Hannover", 22.5])
print(values)  # -> ['10' 'Hannover' '22.5']
print(type(values[0]))
<class 'numpy.str_'>

Dies bedeutet, dass es erforderlich sein kann, zunächst einen Wert vom Typ numpy.str_ wieder in einen anderen Typ zu konvertieren. Andernfalls kann es zu nicht erwünschten Resultaten kommen:

values = np.array([10, "Hannover", 22.5])
x = values[0]
print(x * 10)
10101010101010101010

Hier ergibt 10 * 10 den Wert 10101010101010101010. Bei Verwendung einer Liste würde hingegen das Ergebnis 100 sein, da zwei Integer-Werte multipliziert werden.

Listen

Am populärsten und somit in der Praxis am häufigsten anzutreffen sind die Listen. Sie benötigen zwar relativ viel Speicher, sind aber äußerst flexibel. Denn im Gegensatz zu den bisherigen Arrays, können Listen mit Werten unterschiedlichen Typs erstellt werden:

values = [10, "Hannover", 22.5]
print(values)
[10, "Hannover", 22.5]

Anwendbare Operatoren

Wie beim Datentyp String können auch bei Listen der []-Operator und die Funktion len() verwendet werden:

values = [10, "Hannover", 22.5]
x = values[0]
print(x)
10

print(len(values))
3

Und der +-Operator sowie der Vergleichsoperator == funktionieren ebenso:

a = [4, 2, 22, 53]
b = [7, 101]
print(a + b)
[4, 2, 22, 53, 7, 101]

x = ["Hannover", "Kassel"]
y = ["Hannover", "Kassel"]
print(x == y)
True

Eine Liste kann mithilfe einer for-Schleife durchlaufen werden:

numbers = [4, 27, 34, 2, 11]
for i in number:
    print(i)

Der in-Operator kann auch dazu genutzt werden, das Vorhandensein eines bestimmten Elements zu überprüfen:

print(23 in numbers)
False

Listen sind veränderbar

Wie man den bisherigen Beispielen entnehmen kann, sind Listen den Strings sehr ähnlich. Denn es liegt ebenfalls eine Sequenz (von Elementen) vor. Es gibt aber einen wesentlichen Unterschied: Im Gegensatz zu Strings, sind Listen veränderbar (mutable). Folgendes ist also möglich:

numbers = [4, 27, 34, 2]
numbers[0] = 10
print(numbers)
[10, 27, 34, 2]

Darüber hinaus existieren zahlreiche Methoden, mit denen beispielsweise Elemente zu einer Liste hinzugefügt oder von einer Liste entfernt werden können. Näheres dazu habe ich in einem separaten Blogbeitrag beschrieben.