En Python, una tupla es una colección inmutable de elementos en secuencia.
Como la mayoría de las colecciones, las tuples pueden contener cualquier tipo (o varios tipos) de datos, incluidas otras tuples.
Las tuplas admiten todas las operaciones comunes de secuencia, pero no admiten las operaciones de secuencia mutables.
Se puede iterar sobre los elementos de una tupla con la construcción for item in <tuple>.
Si se necesitan tanto el índice como el valor de un elemento, se puede usar for index, item in enumerate(<tuple>).
Como en cualquier secuencia, se puede acceder a los elementos de las tuples mediante notación de corchetes, usando un 0-based index desde la izquierda o un -1-based index desde la derecha.
Las tuplas también se pueden copiar total o parcialmente usando la notación de rebanadas (<tuple>[<start>:<stop>:<step>]).
Las tuplas se pueden formar de varias maneras, usando el constructor de la clase tuple(<iterable>) o la declaración literal de tuple.
tuple() vacío o con un iterable:>>> 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,)
Los strings son iterables, así que usar un solo str como argumento del constructor tuple() puede tener resultados sorprendentes:
# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')
Los iterables añaden sus elementos uno a uno:
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Como el constructor tuple(<iterable>) solo acepta iterables (o nada) como argumentos, es mucho más fácil crear una tupla de un solo elemento con el método literal.
>>> no_elements = ()
()
>>> one_element = ("Guava",)
("Guava",)
Se pueden incluir estructuras de datos anidadas como elementos de una tuple, incluidas otras 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"))
Las tuplas se pueden concatenar con el operador más +, que desempaqueta cada tuple y crea una nueva tuple combinada.
>>> 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')
Se puede acceder a los elementos de una tuple mediante notación de corchetes, usando un 0-based index desde la izquierda o un -1-based index desde la derecha.
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
Se puede iterar sobre los elementos de una tuple en un bucle con la sintaxis for item in <tuple>.
Si se necesitan tanto los índices como los valores, se puede usar 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.
El operador in se puede usar para comprobar si un elemento pertenece a una tuple.
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> "Parrot" in multiple_elements_list
True
Azara y Rui son compañeros de equipo que compiten en una búsqueda del tesoro con temática pirata. Uno tiene un array de tesoros con coordenadas en el mapa y el otro, un array de nombres de lugares con coordenadas en el mapa. También les han dado mapas en blanco con un punto de partida marcado como AQUÍ ESTÁS.
| Array de Azara | Array de Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Pero las cosas están un poco desorganizadas: las coordenadas de Azara parecen estar formateadas y ordenadas de forma distinta a las de Rui, y no paran de ir de un array al otro para averiguar qué tesoros se corresponden con qué lugares. Como futuros pythonistas, han acudido a ti en busca de ayuda para escribir un pequeño programa (en realidad, un conjunto de funciones) que organice mejor la información de su búsqueda.
Implementa la función get_coordinate(), que recibe un par (treasure, coordinate) del array de Azara y devuelve únicamente la coordenada del mapa extraída.
>>> get_coordinate(('Scrimshawed Whale Tooth', '2A'))
2A
Implementa la función convert_coordinate(), que recibe una coordenada con el formato «2A» y devuelve una tupla con el formato ("2", "A").
>>> convert_coordinate("2A")
("2", "A")
Implementa la función compare_records(), que recibe un par (treasure, coordinate) y un registro (location, coordinate, quadrant) y compara las coordenadas de cada uno.
Devuelve True si las coordenadas «coinciden» y devuelve False si no.
Vuelve a dar formato a las coordenadas según sea necesario para compararlas con precisión.
>>> 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 función create_record(), que recibe un par (treasure, coordinate) del array de Azara y un registro (location, coordinate, quadrant) del array de Rui y devuelve (treasure, coordinate, location, coordinate, quadrant) si las coordenadas coinciden.
Si las coordenadas no coinciden, devuelve el string «not a match».
Vuelve a dar formato a la coordenada según sea necesario para compararla con precisión.
>>> 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"
Limpia los registros combinados de Azara y Rui para que solo haya un conjunto de coordenadas por registro. Crea un informe para que puedan ver en un solo array todo lo que tienen que poner en sus mapas.
Implementa la función clean_up(), que recibe una tupla de tuplas (todo lo de ambos arrays), recorre la tupla externa, descarta las coordenadas que sobran de cada tupla interna y añade cada una a un «informe».
Dale formato al «informe» y devuélvelo de manera que haya un registro limpio en cada línea.
>>> 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
"""
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.