Rheinwerk Computing < openbook >

 
Inhaltsverzeichnis
1 Einleitung
2 Die Programmiersprache Python
Teil I Einstieg in Python
3 Erste Schritte im interaktiven Modus
4 Der Weg zum ersten Programm
5 Kontrollstrukturen
6 Dateien
7 Das Laufzeitmodell
8 Funktionen, Methoden und Attribute
9 Informationsquellen zu Python
Teil II Datentypen
10 Das Nichts – NoneType
11 Operatoren
12 Numerische Datentypen
13 Sequenzielle Datentypen
14 Zuordnungen
15 Mengen
16 Collections
17 Datum und Zeit
18 Aufzählungstypen – Enum
Teil III Fortgeschrittene Programmiertechniken
19 Funktionen
20 Modularisierung
21 Objektorientierung
22 Ausnahmebehandlung
23 Iteratoren
24 Kontextobjekte
25 Manipulation von Funktionen und Methoden
Teil IV Die Standardbibliothek
26 Mathematik
27 Kryptografie
28 Reguläre Ausdrücke
29 Schnittstelle zu Betriebssystem und Laufzeitumgebung
30 Kommandozeilenparameter
31 Dateisystem
32 Parallele Programmierung
33 Datenspeicherung
34 Netzwerkkommunikation
35 Debugging und Qualitätssicherung
36 Dokumentation
Teil V Weiterführende Themen
37 Anbindung an andere Programmiersprachen
38 Distribution von Python-Projekten
39 Grafische Benutzeroberflächen
40 Python als serverseitige Programmiersprache im WWW – ein Einstieg in Django
41 Wissenschaftliches Rechnen
42 Insiderwissen
43 Von Python 2 nach Python 3
A Anhang
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 464 KB

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Python 3 von Johannes Ernesti, Peter Kaiser
Das umfassende Handbuch
Buch: Python 3

Python 3
Pfeil 15 Mengen
Pfeil 15.1 Die Datentypen set und frozenset
Pfeil 15.1.1 Operatoren
Pfeil 15.1.2 Methoden
Pfeil 15.2 Veränderliche Mengen – set
Pfeil 15.3 Unveränderliche Mengen – frozenset
 
Zum Seitenanfang

15    Mengen Zur vorigen ÜberschriftZur nächsten Überschrift

Eine Menge (engl. set) ist eine ungeordnete Sammlung von Elementen, in der jedes Element nur einmal enthalten sein darf. In Python gibt es zur Darstellung von Mengen zwei Basisdatentypen: set für eine veränderliche Menge sowie frozenset für eine unveränderliche Menge – set ist demnach mutabel, frozenset immutabel.

 
Zum Seitenanfang

15.1    Die Datentypen set und frozenset Zur vorigen ÜberschriftZur nächsten Überschrift

Eine leere Instanz der Datentypen set und frozenset wird folgendermaßen erzeugt:

>>> set()
set()
>>> frozenset()
frozenset()

Wenn die Menge bereits zum Zeitpunkt der Instanziierung Elemente enthalten soll, können diese den Konstruktoren als Elemente eines iterierbaren Objekts, beispielsweise eines Tupels, übergeben werden:

>>> set(("A", "B", "C"))
{'C', 'B', 'A'}
>>> frozenset([True, 47, (1,2,3)])
frozenset({True, (1, 2, 3), 47})

Seit Python 3 existiert ein spezielles Literal zum Erzeugen von veränderlichen Mengen. Wie in der Mathematik werden die Elemente, die die Menge enthalten soll, durch Kommata getrennt in geschweifte Klammern geschrieben.

>>> s = {1, 2, 3, 99, -7}
>>> s
{1, 2, 99, 3, -7}

Diese Schreibweise bringt ein Problem mit sich: Da die geschweiften Klammern bereits für Dictionarys verwendet werden, ist es mit diesem Literal nicht möglich, eine leere Menge zu erzeugen – {} instanziiert stets ein leeres Dictionary. Wie oben gezeigt, müssen leere Mengen also über set() instanziiert werden. Für den Datentyp frozenset existiert kein Literal, er muss stets über den Konstruktor frozenset() instanziiert werden.

Bei einer Menge handelt es sich um ein iterierbares Objekt, das in einer for-Schleife durchlaufen werden kann. Dazu folgendes Beispiel:

menge = {1, 100, "a", 0.5}
for element in menge:
print(element)

Dieser Code erzeugt folgende Ausgabe:

a
1
100
0.5

Beachten Sie dabei, dass Mengen ungeordnete Datentypen sind, ihre Elemente also in keiner festgelegten Reihenfolge durchlaufen werden.

[»]  Hinweis

Mit einer Set Comprehension kann eine Menge erzeugt werden, indem eine Bildungsvorschrift für die Elemente ähnlich einer for-Schleife angegeben wird.

Mit der folgenden Set Comprehension wird eine Menge mit den Quadraten der Zahlen von 0 bis 9 erzeugt.

>>> {i*i for i in range(10)}
{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}

Näheres zu Set Comprehension erfahren Sie in Abschnitt 23.1.3.

Beim Erstellen einer Menge kann auf Unpacking zurückgegriffen werden:

>>> {1, 2, *[3, 4]}
{1, 2, 3, 4}

Nähere Informationen zum Thema Unpacking finden Sie in Abschnitt 13.3.1.

 
Zum Seitenanfang

15.1.1    Operatoren Zur vorigen ÜberschriftZur nächsten Überschrift

Die Datentypen set und frozenset verfügen über eine gemeinsame Schnittstelle, die im Folgenden näher erläutert werden soll. Wir möchten damit beginnen, alle gemeinsamen Operatoren zu behandeln. Der Einfachheit halber werden wir uns bei der Beschreibung der Operatoren ausschließlich auf den Datentyp set beziehen. Dennoch können sie und auch die Methoden, die später beschrieben werden, für frozenset genauso verwendet werden.

Operator Beschreibung
len(s) Liefert die Anzahl aller in der Menge s enthaltenen Elemente.
x in s True, wenn x in der Menge s enthalten ist, andernfalls False
x not in s True, wenn x nicht in der Menge s enthalten ist, andernfalls False
s <= t True, wenn es sich bei der Menge s um eine Teilmenge der Menge t handelt, andernfalls False
s < t True, wenn es sich bei der Menge s um eine echte Teilmenge* der Menge t handelt, andernfalls False
s >= t True, wenn es sich bei der Menge t um eine Teilmenge der Menge s handelt, andernfalls False
s > t True, wenn es sich bei der Menge t um eine echte Teilmenge der Menge s handelt, andernfalls False
s | t Erzeugt eine neue Menge, die alle Elemente von s und t enthält.
Diese Operation bildet also die Vereinigungsmenge zweier Mengen.
s & t Erzeugt eine neue Menge, die die Objekte enthält, die sowohl Element der Menge s als auch Element der Menge t sind.
Diese Operation bildet also die Schnittmenge zweier Sets.
s - t Erzeugt eine neue Menge mit allen Elementen von s, außer denen, die auch in t enthalten sind.
Diese Operation erzeugt also die Differenz zweier Mengen.
s ^ t Erzeugt eine neue Menge, die alle Objekte enthält, die entweder in s oder in t vorkommen, nicht aber in beiden.
Diese Operation bildet also die symmetrische Differenz** zweier Mengen.
* Eine Menge T wird »echte Teilmenge« einer zweiten Menge M genannt, wenn T Teilmenge von M ist und es mindestens ein Element gibt, das in M, aber nicht in T enthalten ist.
** Die symmetrische Differenz zweier Mengen A und B enthält alle Elemente von A und B, die nur in genau einer der beiden Mengen enthalten sind. Der Operator ^ lässt sich also folgendermaßen nachbilden:
A ^ B = (A | B) - (A & B)

Tabelle 15.1    Operatoren der Datentypen set und frozenset

Für einige dieser Operatoren existieren auch erweiterte Zuweisungen.

Operator Entsprechung
s |= t s = s | t
s &= t s = s & t
s -= t s = s - t
s ^= t s = s ^ t

Tabelle 15.2    Operatoren des Datentyps set

Diese Operatoren gibt es auch für den Datentyp frozenset. Sie verändern aber nicht die Menge selbst, sondern erzeugen in diesem Fall eine neue frozenset-Instanz, die das Ergebnis der Operation enthält und von nun an von s referenziert wird.

Im Folgenden werden alle Operatoren anhand von Beispielen anschaulich beschrieben. Die Beispiele sind dabei in diesem Kontext zu sehen:

>>> s = {0,1,2,3,4,5,6,7,8,9}
>>> t = {6,7,8,9,10,11,12,13,14,15}

Es existieren also zwei Mengen namens s und t, die aus Gründen der Übersichtlichkeit jeweils ausschließlich über numerische Elemente verfügen. Die Mengen überschneiden sich in einem gewissen Bereich. Grafisch kann die Ausgangssituation wie in Abbildung 15.1 veranschaulicht werden. Der dunkelgraue Bereich entspricht der Schnittmenge von s und t.

Die Ausgangssituation

Abbildung 15.1    Die Ausgangssituation

Anzahl der Elemente

Um die Anzahl der Elemente zu bestimmen, die in einer Menge enthalten sind, wird – wie schon bei den sequenziellen Datentypen und dem Dictionary – die eingebaute Funktion len verwendet:

>>> len(s) 
10

Ist ein Element im Set enthalten?

Zum Test, ob ein Element in einer Menge enthalten ist, dient der Operator in. Zudem kann sein Gegenstück not in verwendet werden, um das Gegenteil zu prüfen:

>>> 10 in s
False
>>> 10 not in t
False

Handelt es sich um eine Teilmenge?

Um zu testen, ob es sich bei einer Menge um eine Teilmenge einer anderen Menge handelt, werden die Operatoren <= und >= sowie < und > für echte Teilmengen verwendet:

>>> u = {4,5,6}
>>> u <= s
True
>>> u < s
True
>>> u >= s
False
>>> u <= t
False

Beachten Sie den Unterschied zwischen Teilmenge (<=, >=) und echter Teilmenge (<, >) in folgendem Beispiel:

>>> m = {1,2,3}
>>> n = {1,2,3}
>>> m <= n
True
>>> m < n
False

Vereinigung zweier Mengen

Um zwei Mengen zusammenzufügen, bietet Python den Operator |. Er erzeugt eine neue Menge, die alle Elemente enthält, die in s oder in t enthalten sind:

>>> s | t
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

Abbildung 15.2 veranschaulicht dies.

Vereinigungsmenge von s und t

Abbildung 15.2    Vereinigungsmenge von s und t

Für den Vereinigungsoperator wird dasselbe Symbol verwendet wie für das bitweise ODER zweier ganzer Zahlen. Das liegt daran, dass die Vereinigung der Mengen s und t alle Elemente enthält, die in s ODER in t enthalten sind. Beachten Sie, dass es sich dabei wie bei dem bitweisen Operator um ein nicht ausschließendes ODER handelt, die Vereinigungsmenge also auch die Elemente enthält, die sowohl in s als auch in t vorkommen.

Schnittmenge

Um die Schnittmenge zweier Mengen zu bestimmen, wird der Operator & verwendet. Er erzeugt eine neue Menge, die alle Elemente enthält, die sowohl im ersten als auch im zweiten Operanden enthalten sind.

>>> s & t
{8, 9, 6, 7}

Auch die Auswirkungen dieses Operators veranschaulichen wir in Abbildung 15.3:

Schnittmenge von s und t

Abbildung 15.3    Schnittmenge von s und t

Die Schnittmenge zweier Mengen s und t enthält alle Elemente, die in s UND t vorkommen. Daraus erschließt sich die Wahl des Operatorsymbols &, das auch für das bitweise UND verwendet wird.

Differenz zweier Mengen

Um die Differenz zweier Mengen zu bestimmen, wird der Operator verwendet. Es wird eine neue Menge gebildet, die alle Elemente des ersten Operanden enthält, die nicht zugleich im zweiten Operanden enthalten sind:

>>> s - t
{0, 1, 2, 3, 4, 5}
>>> t - s
{10, 11, 12, 13, 14, 15}

Grafisch ist dies in Abbildung 15.4 dargestellt.

Differenz von s und t

Abbildung 15.4    Differenz von s und t

Symmetrische Differenz zweier Mengen

Um die symmetrische Differenz zweier Mengen zu bestimmen, nutzen Sie den Operator ^. Er erzeugt eine neue Menge, die alle Elemente enthält, die entweder im ersten oder im zweiten Operanden vorkommen, nicht aber in beiden gleichzeitig:

>>> s ^ t
{0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15}

Gönnen wir uns einen letzten Blick auf unsere Grafik in Abbildung 15.5:

Symmetrische Differenz von s und t

Abbildung 15.5    Symmetrische Differenz von s und t

Die symmetrische Differenzmenge zweier Mengen s und t enthält diejenigen Elemente, die entweder in s oder in t (nicht aber in beiden Mengen) enthalten sind. Daraus erschließt sich die Wahl des Operatorsymbols ^, das auch für das bitweise ausschließende ODER (XOR) verwendet wird.

 
Zum Seitenanfang

15.1.2    Methoden Zur vorigen ÜberschriftZur nächsten Überschrift

Die Datentypen set und frozenset verfügen über eine recht überschaubare Liste von Methoden, die in ihrem Zweck sogar größtenteils gleichbedeutend mit einem der bereits diskutierten Operatoren sind.

Methode Beschreibung
s.issubset(t) Äquivalent zu s <= t
s.issuperset(t) Äquivalent zu s >= t
s.isdisjoint(t) Prüft, ob die Mengen s und t disjunkt sind, das heißt, ob sie eine leere Schnittmenge haben.
s.union(t) Äquivalent zu s | t
s.intersection(t) Äquivalent zu s & t
s.difference(t) Äquivalent zu s - t
s.symmetric_difference(t) Äquivalent zu s ^ t
s.copy() Erzeugt eine Kopie des Sets s.

Tabelle 15.3    Methoden der Datentypen set und frozenset

Der Unterschied zwischen den Operatoren <=, >=, |, &, - und ^ und den jeweils bedeutungsgleichen Methoden issubset, issuperset, union, intersection, difference und symmetric_difference ist, dass bei Verwendung der Operatoren beide Operanden set- oder frozenset-Instanzen sein müssen, während die Methoden für den Parameter t einen beliebigen sequenziellen Datentyp akzeptieren:

>>> {1,2,3} | frozenset([4,5,6])
{1, 2, 3, 4, 5, 6}
>>> {1,2,3} | "ABC"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for |: 'set' and 'str'
>>> {1,2,3}.union("ABC")
{1, 2, 3, 'A', 'C', 'B'}

Abgesehen von diesem Unterschied verhalten sich die Methoden wie die zugehörigen Operatoren und benötigen deshalb keine weiteren Erklärungen.

s.copy()

Eine Kopie eines Sets erzeugt die Methode copy:

>>> m = s.copy()
>>> m
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> m is s
False
>>> m == s
True

Wichtig ist, dass nur die Menge selbst kopiert wird. Bei den enthaltenen Elementen handelt es sich sowohl in der ursprünglichen Menge als auch in der Kopie um Referenzen auf dieselben Objekte. Dies ist Ihnen bereits aus Abschnitt 13.2, »Listen – list«, geläufig.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Python 3 Python 3
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Einstieg in Python
Einstieg in Python


Zum Rheinwerk-Shop: Python. Der Grundkurs
Python. Der Grundkurs


Zum Rheinwerk-Shop: Algorithmen mit Python
Algorithmen mit Python


Zum Rheinwerk-Shop: Objektorientierte Programmierung
Objektorientierte Programmierung


Zum Rheinwerk-Shop: Raspberry Pi. Das umfassende Handbuch
Raspberry Pi. Das umfassende Handbuch


Zum Rheinwerk-Shop: Roboter-Autos mit dem Raspberry Pi
Roboter-Autos mit dem Raspberry Pi


Zum Rheinwerk-Shop: Neuronale Netze programmieren mit Python
Neuronale Netze programmieren mit Python


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2020
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern