Tracks
/
Python
Python
/
Übungen
/
Schatzsuche in Tisbury
Schatzsuche in Tisbury

Schatzsuche in Tisbury

Lernübung

Einführung

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 erstellen

Tupel lassen sich auf verschiedene Arten bilden: entweder mit dem Klassenkonstruktor tuple(<iterable>) oder mit der Literalschreibweise tuple.

Den Konstruktor 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)
Ein Tupel als Literal deklarieren:

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 verketten

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')

Zugriff auf Elemente eines Tupels

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

Über die Elemente eines Tupels iterieren

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.

Prüfen, ob ein Element in einem Tupel enthalten ist

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

Anleitung

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
Treasure Coordinates
Amethyst Octopus 1F
Angry Monkey Figurine 5B
Antique Glass Fishnet Float 3D
Brass Spyglass 4B
Carved Wooden Elephant 8C
Crystal Crab 6A
Glass Starfish 6D
Model Ship in Large Bottle 8A
Pirate Flag 7F
Robot Parrot 1C
Scrimshawed Whale Tooth 2A
Silver Seahorse 4E
Vintage Pirate Hat 7E
Location Name Coordinates Quadrant
Seaside Cottages ("1", "C") Blue
Aqua Lagoon (Island of Mystery) ("1", "F") Yellow
Deserted Docks ("2", "A") Blue
Spiky Rocks ("3", "D") Yellow
Abandoned Lighthouse ("4", "B") Blue
Hidden Spring (Island of Mystery) ("4", "E") Yellow
Stormy Breakwater ("5", "B") Purple
Old Schooner ("6", "A") Purple
Tangled Seaweed Patch ("6", "D") Orange
Quiet Inlet (Island of Mystery) ("7", "E") Orange
Windswept Hilltop (Island of Mystery) ("7", "F") Orange
Harbor Managers Office ("8", "A") Purple
Foggy Seacave ("8", "C") Purple

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.

1. Koordinaten extrahieren

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

2. Koordinaten formatieren

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")

3. Koordinaten abgleichen

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

4. Übereinstimmende Datensätze kombinieren

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"

5. „Aufräumen" & einen Bericht über alle Datensätze erstellen

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
"""
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Python Exercism

Bereit, mit Schatzsuche in Tisbury zu starten?

Melde dich bei Exercism an, um Python mit 17 Konzepte146 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.