En Python, un tuple est une collection immuable d'éléments en séquence.
Comme la plupart des collections, tuples peut contenir n'importe quel type (ou plusieurs types) de données, y compris d'autres tuples.
Les tuples prennent en charge toutes les opérations courantes sur les séquences, mais ne prennent pas en charge les opérations sur les séquences mutables.
On peut parcourir les éléments d'un tuple avec la construction for item in <tuple>.
Si l'on a besoin à la fois de l'indice et de la valeur d'un élément, on peut utiliser for index, item in enumerate(<tuple>).
Comme pour toute séquence, on accède aux éléments d'un tuples via la notation entre crochets, en utilisant un indice 0-based index en partant de la gauche ou un indice -1-based index en partant de la droite.
On peut aussi copier un tuple en entier ou en partie grâce à la notation de tranches (<tuple>[<start>:<stop>:<step>]).
Un tuple peut être créé de plusieurs façons : soit avec le constructeur de classe tuple(<iterable>), soit avec la déclaration littérale tuple.
tuple() à vide ou avec un itérable :>>> 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,)
Les strings sont itérables, donc utiliser une seule str comme argument du constructeur tuple() peut donner des résultats surprenants :
# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')
Les éléments d'un itérable sont ajoutés un par un :
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Comme le constructeur tuple(<iterable>) n'accepte que des itérables (ou rien du tout) comme arguments, il est bien plus simple de créer un tuple à un seul élément avec la méthode littérale.
>>> no_elements = ()
()
>>> one_element = ("Guava",)
("Guava",)
On peut inclure des structures de données imbriquées comme éléments d'un tuple, y compris d'autres 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"))
On peut concaténer des tuples avec l'opérateur plus +, qui décompose chaque tuple pour créer un nouveau tuple combiné.
>>> 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')
On accède aux éléments d'un tuple via la notation entre crochets, en utilisant un indice 0-based index en partant de la gauche ou un indice -1-based index en partant de la droite.
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
On peut parcourir les éléments d'un tuple dans une boucle avec la syntaxe for item in <tuple>.
Si l'on a besoin à la fois des indices et des valeurs, on peut utiliser 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'opérateur in permet de vérifier si une valeur appartient à un tuple.
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> "Parrot" in multiple_elements_list
True
Azara et Rui forment une équipe qui participe à une chasse au trésor sur le thème des pirates. L'un a une liste de trésors avec leurs coordonnées sur la carte, l'autre une liste de noms de lieux avec leurs coordonnées. On leur a aussi donné des cartes vierges avec un point de départ marqué «\u00A0VOUS ÊTES ICI\u00A0».
| Liste d'Azara | Liste de Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Mais tout est un peu désorganisé\u00A0: les coordonnées d'Azara semblent formatées et triées différemment de celles de Rui, et ils doivent sans cesse passer d'une liste à l'autre pour déterminer quels trésors correspondent à quels lieux. Comme ce sont de jeunes passionnés de Python, ils sont venus te demander de l'aide pour écrire un petit programme (en fait, un ensemble de fonctions) qui organise mieux les informations de leur chasse.
Implémente la fonction get_coordinate() qui prend une paire (treasure, coordinate) de la liste d'Azara et renvoie uniquement la coordonnée extraite sur la carte.
>>> get_coordinate(('Scrimshawed Whale Tooth', '2A'))
2A
Implémente la fonction convert_coordinate() qui prend une coordonnée au format «\u00A02A\u00A0» et renvoie un tuple au format ("2", "A").
>>> convert_coordinate("2A")
("2", "A")
Implémente la fonction compare_records() qui prend une paire (treasure, coordinate) et un enregistrement (location, coordinate, quadrant), puis compare leurs coordonnées.
Renvoie True si les coordonnées «\u00A0correspondent\u00A0», et False sinon.
Remets les coordonnées au bon format si nécessaire pour comparer correctement.
>>> 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
Implémente la fonction create_record() qui prend une paire (treasure, coordinate) de la liste d'Azara et un enregistrement (location, coordinate, quadrant) de la liste de Rui, et renvoie (treasure, coordinate, location, coordinate, quadrant) si les coordonnées correspondent.
Si les coordonnées ne correspondent pas, renvoie la string "not a match".
Remets la coordonnée au bon format si nécessaire pour comparer correctement.
>>> 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"
Nettoie les enregistrements combinés d'Azara et de Rui pour qu'il n'y ait plus qu'un seul jeu de coordonnées par enregistrement. Fais un rapport pour qu'ils voient une liste unique de tout ce qu'ils doivent reporter sur leurs cartes.
Implémente la fonction clean_up() qui prend un tuple de tuples (tout le contenu des deux listes), parcourt le tuple externe, supprime les coordonnées inutiles de chaque tuple interne et ajoute chacun d'eux à un «\u00A0rapport\u00A0».
Mets en forme et renvoie le «\u00A0rapport\u00A0» de façon à obtenir un enregistrement nettoyé par ligne.
>>> 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
"""
Inscris-toi sur Exercism pour apprendre et maîtriser Python avec 17 concepts146 exercices, et un vrai mentorat humain, le tout gratuitement.