In Python ist ein Tupel eine unveränderliche Sammlung von Elementen in einer Sequenz.
Wie die meisten Sammlungen können tuples jeden (oder mehrere) Datentyp(en) enthalten, auch andere tuples.
Tupel unterstützen alle gemeinsamen Sequenzoperationen, aber nicht die Operationen für veränderbare Sequenzen.
Die Elemente eines Tupels lassen sich mit dem Konstrukt for item in <tuple> durchlaufen.
Wenn du sowohl den Index als auch den Wert eines Elements brauchst, kannst du for index, item in enumerate(<tuple>) verwenden.
Wie bei jeder Sequenz kannst du auf Elemente in tuples über die Klammernotation zugreifen, und zwar mit einem 0-based index, der von links zählt, oder einem -1-based index, der von rechts zählt.
Tupel kannst du außerdem ganz oder teilweise mit der Slice-Notation kopieren (<tuple>[<start>:<stop>:<step>]).
Tupel lassen sich auf verschiedene Arten bilden: entweder mit dem Klassenkonstruktor tuple(<iterable>) oder mit der Literalschreibweise tuple.
tuple() leer oder mit einem iterierbaren Objekt verwenden:>>> no_elements = tuple()
()
# The constructor *requires* an iterable, so single elements must be passed in a list or another tuple.
>>> one_element = tuple([16])
(16,)
Strings sind iterierbar. Wenn du also einen einzelnen str als Argument an den Konstruktor tuple() übergibst, kann das überraschende Ergebnisse liefern:
# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')
Bei einzelnen Iterables werden die Elemente eins nach dem anderen hinzugefügt:
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Da der Konstruktor tuple(<iterable>) nur Iterables (oder gar nichts) als Argumente akzeptiert, ist es viel einfacher, ein Ein-Element-Tupel mit der Literalschreibweise zu erstellen.
>>> no_elements = ()
()
>>> one_element = ("Guava",)
("Guava",)
Verschachtelte Datenstrukturen können als tuple-Elemente vorkommen, auch andere tuples:
>>> nested_data_structures = ({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
>>> nested_data_structures_1 = (["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
(["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
Tupel lassen sich mit dem Plus-Operator + verketten. Dabei wird jedes tuple entpackt und ein neues, kombiniertes tuple erzeugt.
>>> new_via_concatenate = ("George", 5) + ("cat", "Tabby")
("George", 5, "cat", "Tabby")
#likewise, using the multiplication operator * is the equivalent of using + n times
>>> first_group = ("cat", "dog", "elephant")
>>> multiplied_group = first_group * 3
('cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant')
Auf Elemente in einem tuple kannst du über die Klammernotation zugreifen, mit einem 0-based index, der von links zählt, oder einem -1-based index, der von rechts zählt.
student_info = ("Alyssa", "grade 3", "female", 8 )
#gender is at index 2 or index -2
>>> student_gender = student_info[2]
'female'
>>> student_gender = student_info[-2]
'female'
#name is at index 0 or index -4
>>> student_name = student_info[0]
Alyssa
>>> student_name = student_info[-4]
Alyssa
Elemente in einem tuple lassen sich in einer Schleife mit der Syntax for item in <tuple> durchlaufen.
Wenn du sowohl die Indizes als auch die Werte brauchst, kannst du for index, item in enumerate(<tuple>) verwenden.
>>> student_info = ("Alyssa", "grade 3", "female", 8 )
>>> for item in student_info:
... print(item)
...
Alyssa
grade 3
female
8
>>> for index, item in enumerate(student_info):
... print("Index is: " + str(index) + ", value is: " + str(item) +".")
...
Index is: 0, value is: Alyssa.
Index is: 1, value is: grade 3.
Index is: 2, value is: female.
Index is: 3, value is: 8.
Mit dem Operator in kannst du prüfen, ob ein Element in einem tuple enthalten ist.
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> "Parrot" in multiple_elements_list
True
Azara und Rui sind Teamkolleginnen und treten in einer Schatzsuche im Piratenstil gegeneinander an. Die eine hat eine Liste mit Schätzen und ihren Kartenkoordinaten, die andere eine Liste mit Ortsnamen und ihren Kartenkoordinaten. Außerdem haben sie leere Karten bekommen, auf denen ein Startort mit DU BIST HIER markiert ist.
| Azaras Liste | Ruis Liste | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Doch die Dinge sind etwas unübersichtlich: Azaras Koordinaten scheinen anders formatiert und sortiert zu sein als die von Rui, und sie müssen ständig von einer Liste zur anderen schauen, um herauszufinden, welche Schätze zu welchen Orten gehören. Als angehende Pythonistas sind sie zu dir gekommen, um Hilfe beim Schreiben eines kleinen Programms (genauer gesagt einer Reihe von Funktionen) zu bekommen, mit dem sie ihre Informationen zur Schatzsuche besser organisieren können.
Implementiere die Funktion get_coordinate(), die ein Paar (treasure, coordinate) aus Azaras Liste nimmt und nur die extrahierte Kartenkoordinate zurückgibt.
>>> get_coordinate(('Scrimshawed Whale Tooth', '2A'))
2A
Implementiere die Funktion convert_coordinate(), die eine Koordinate im Format "2A" nimmt und ein Tupel im Format ("2", "A") zurückgibt.
>>> convert_coordinate("2A")
("2", "A")
Implementiere die Funktion compare_records(), die ein Paar (treasure, coordinate) und einen Datensatz (location, coordinate, quadrant) nimmt und die Koordinaten aus beiden vergleicht.
Gib True zurück, wenn die Koordinaten „übereinstimmen", und gib False zurück, wenn nicht.
Formatiere die Koordinaten nach Bedarf neu, damit der Vergleich korrekt ist.
>>> compare_records(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
False
>>> compare_records(('Model Ship in Large Bottle', '8A'), ('Harbor Managers Office', ('8', 'A'), 'purple'))
True
Implementiere die Funktion create_record(), die ein Paar (treasure, coordinate) aus Azaras Liste und einen Datensatz (location, coordinate, quadrant) aus Ruis Liste nimmt und (treasure, coordinate, location, coordinate, quadrant) zurückgibt, wenn die Koordinaten übereinstimmen.
Wenn die Koordinaten nicht übereinstimmen, gib den String "not a match" zurück.
Formatiere die Koordinate nach Bedarf neu, damit der Vergleich korrekt ist.
>>> create_record(('Brass Spyglass', '4B'), ('Abandoned Lighthouse', ('4', 'B'), 'Blue'))
('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')
>>> create_record(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
"not a match"
Räume die kombinierten Datensätze von Azara und Rui auf, sodass es nur noch einen Satz Koordinaten pro Datensatz gibt. Erstelle einen Bericht, damit sie eine einzige Liste mit allem sehen, was sie auf ihre Karten eintragen müssen.
Implementiere die Funktion clean_up(), die ein Tupel aus Tupeln nimmt (alles aus beiden Listen), das äußere Tupel durchläuft, aus jedem inneren Tupel die unerwünschten Koordinaten entfernt und jedes zu einem ‚Bericht' hinzufügt.
Formatiere und gib den ‚Bericht' so zurück, dass in jeder Zeile ein bereinigter Datensatz steht.
>>> clean_up((('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue'), ('Vintage Pirate Hat', '7E', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange'), ('Crystal Crab', '6A', 'Old Schooner', ('6', 'A'), 'Purple')))
"""
('Brass Spyglass', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')\n
('Vintage Pirate Hat', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange')\n
('Crystal Crab', 'Old Schooner', ('6', 'A'), 'Purple')\n
"""
Melde dich bei Exercism an, um Python mit 17 Konzepte146 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.