Track
/
Python
Python
/
Esercizi
/
La caccia al tesoro di Tisbury
La caccia al tesoro di Tisbury

La caccia al tesoro di Tisbury

Esercizio di apprendimento

Introduzione

In Python, una tupla è una collezione immutabile di elementi in sequenza. Come la maggior parte delle collezioni, le tuples possono contenere qualsiasi tipo di dato (o più tipi), comprese altre tuples. Le tuple supportano tutte le operazioni comuni sulle sequenze, ma non supportano le operazioni sulle sequenze mutabili.

Gli elementi di una tupla si possono iterare usando il costrutto for item in <tuple>. Se servono sia l'indice che il valore di un elemento, si può usare for index, item in enumerate(<tuple>). Come per qualsiasi sequenza, si può accedere agli elementi delle tuples tramite la notazione con parentesi, usando un numero 0-based index da sinistra oppure un numero -1-based index da destra. Le tuple si possono anche copiare interamente o in parte usando lo slicing (<tuple>[<start>:<stop>:<step>]).

Costruzione di una tupla

Le tuple si possono creare in diversi modi: usando il costruttore della classe tuple(<iterable>) oppure la dichiarazione del letterale tuple.

Usare il costruttore tuple() vuoto o con un iterabile:

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

Le stringhe sono iterabili, quindi passare una singola str come argomento al costruttore tuple() può dare risultati sorprendenti:

# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')

Quando si passa un singolo iterabile, i suoi elementi vengono aggiunti uno alla volta:

>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)

>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Dichiarare una tupla come letterale:

Dato che il costruttore tuple(<iterable>) accetta come argomenti solo iterabili (o niente), è molto più semplice creare una tupla con un solo elemento usando il metodo del letterale.

>>> no_elements = ()
()

>>> one_element = ("Guava",)
("Guava",)

Strutture di dati annidate possono essere incluse come elementi di una tuple, comprese altre 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"))

Concatenazione di tuple

Le tuple si possono concatenare con l'operatore più +, che spacchetta ogni tuple creando una nuova tuple combinata.

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

Accedere agli elementi di una tupla

Si può accedere agli elementi di una tuple tramite la notazione con parentesi, usando un numero 0-based index da sinistra oppure un numero -1-based index da destra.

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

Iterare sugli elementi di una tupla

Gli elementi dentro una tuple si possono iterare in un ciclo usando la sintassi for item in <tuple>. Se servono sia gli indici che i valori, si può usare for index, item in enumerate(<tuple>).

>>> 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.

Verificare l'appartenenza a una tupla

L'operatore in si può usare per verificare l'appartenenza a una tuple.

>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)

>>> "Parrot" in multiple_elements_list
True

Istruzioni

Azara e Rui sono compagni di squadra che gareggiano in una caccia al tesoro a tema pirati. Uno ha una lista di tesori con le coordinate sulla mappa, l'altro una lista di nomi di luoghi con le coordinate sulla mappa. Hanno anche ricevuto delle mappe vuote con un punto di partenza contrassegnato da SEI QUI.


La lista di Azara La lista di Rui
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

Ma le cose sono un po' disordinate: le coordinate di Azara sembrano formattate e ordinate in modo diverso da quelle di Rui, e devono continuare a passare da una lista all'altra per capire quali tesori vanno con quali luoghi. Da aspiranti pythonisti, si sono rivolti a te per farsi aiutare a scrivere un piccolo programma (in realtà un insieme di funzioni) per organizzare meglio le informazioni della loro caccia.

1. Estrai le coordinate

Implementa la funzione get_coordinate() che prende una coppia (treasure, coordinate) dalla lista di Azara e restituisce solo la coordinata sulla mappa estratta.

>>> get_coordinate(('Scrimshawed Whale Tooth', '2A'))
2A

2. Formatta le coordinate

Implementa la funzione convert_coordinate() che prende una coordinata nel formato «2A» e restituisce una tupla nel formato ("2", "A").

>>> convert_coordinate("2A")
("2", "A")

3. Abbina le coordinate

Implementa la funzione compare_records() che prende una coppia (treasure, coordinate) e un record (location, coordinate, quadrant) e confronta le coordinate di ciascuno. Restituisci True se le coordinate «corrispondono», e restituisci False se no. Riformatta le coordinate come serve per un confronto accurato.

>>> 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. Combina i record abbinati

Implementa la funzione create_record() che prende una coppia (treasure, coordinate) dalla lista di Azara e un record (location, coordinate, quadrant) dalla lista di Rui e restituisce (treasure, coordinate, location, coordinate, quadrant) se le coordinate corrispondono. Se le coordinate non corrispondono, restituisci la stringa "not a match". Riformatta la coordinata come serve per un confronto accurato.

>>> 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. «Ripulisci» e crea un report di tutti i record

Ripulisci i record combinati di Azara e Rui in modo che ci sia un solo insieme di coordinate per record. Crea un report così possono vedere un'unica lista di tutto ciò che devono mettere sulle loro mappe. Implementa la funzione clean_up() che prende una tupla di tuple (tutto da entrambe le liste), scorre la tupla esterna, elimina le coordinate indesiderate da ogni tupla interna e aggiunge ciascuna a un «report». Formatta e restituisci il «report» in modo che ci sia un record ripulito su ogni riga.

>>> 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
"""
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Python Exercism

Vuoi iniziare La caccia al tesoro di Tisbury?

Iscriviti a Exercism per imparare e padroneggiare Python con 17 concetti146 esercizi e il mentoring di persone reali, tutto gratis.