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>]).
Le tuple si possono creare in diversi modi: usando il costruttore della classe tuple(<iterable>) oppure la dichiarazione del letterale tuple.
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)
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"))
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')
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
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.
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
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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
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.
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
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")
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
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"
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
"""
Iscriviti a Exercism per imparare e padroneggiare Python con 17 concetti146 esercizi e il mentoring di persone reali, tutto gratis.