<jupyter_start><jupyter_text>TuplasLas tuplas son un tipo de dato que permite representar una secuencia de datos.Se puede ver a las tuplas como una estructura de datos (o contenedor).Las tuplas son inmutables: no se pueden modificar una vez creados.Podemos acceder a los elementos individuales de la tupla. Además, se puede utilizar la técnica de slicing para acceder a un conjunto de datos de la tupla: el resultado será una tupla.  Creación de tuplas- Literal- La clase `tuple()`<jupyter_code>punto = (2, -5)
punto
type(punto)
len(punto)
punto = tuple([2, -5])
punto
type(punto)
len(punto)<jupyter_output><empty_output><jupyter_text>Se puede crear una tupla omitiendo los paréntesis y escribiendo únicamente las comas para separar los valores que integran la tupla:<jupyter_code>punto = 2, -5
punto
type(punto)
len(punto)
valor = 3,7
valor<jupyter_output><empty_output><jupyter_text>Una tupla se puede crear a partir de otra tupla utilizando la clase `tuple()`:<jupyter_code>punto_2d = tuple(punto)

punto_2d<jupyter_output><empty_output><jupyter_text>¿Cómo creamos una tupla de un sólo elemento?<jupyter_code>x = (2)
x
type(x)
x = (2,)

x
type(x)
len(x)<jupyter_output><empty_output><jupyter_text>Acceso a los elementos de una tupla.Utilizamos el operador `[]`.<jupyter_code>punto_3d = (1, 2, 3)

punto_3d
len(punto_3d)<jupyter_output><empty_output><jupyter_text>Acceso al primer elemento de la tupla:<jupyter_code>punto_3d[0]<jupyter_output><empty_output><jupyter_text>Acceder al valor de z (el último elemento):<jupyter_code>punto_3d[2]<jupyter_output><empty_output><jupyter_text>Se pueden utilizar índices negativos para acceder al contenido de una tupla:<jupyter_code>punto_3d[-1]<jupyter_output><empty_output><jupyter_text>Acceso al primer elemento de la tupla utilizando un índice negativo:<jupyter_code>punto_3d[-3]
punto_3d[-len(punto_3d)]
len(punto_3d)
-len(punto_3d)<jupyter_output><empty_output><jupyter_text>Errores al intentar acceder a los elementos de una tupla:<jupyter_code># punto_3d[3] # El índice 3 no existe en la tupla `punto_3d`. Se genera el error `IndexError`
# punto_3d[-4] # # El índice -4 no existe en la tupla `punto_3d`. Se genera el error `IndexError`
try:
    punto[-4]
except IndexError as e:
    print(f'Error: {e}')<jupyter_output>Error: tuple index out of range<jupyter_text>Acceso a múltiples elementos de una tupla utilizando la técnica de slicing`[inicio:final]`inicio: enterofinal: enteroCuando el `inicio` es igual a cero, se puede omitir.Cuando el `final` es igual a la cantidad de elementos que tiene la lista, también se puede omitir.El índice `final` no es incluído.<jupyter_code>lenguajes = ('Python', 'JavaScript', 'C++', 'Java', 'PHP', 'Go', 'C')

lenguajes
len(lenguajes)
resultado = lenguajes[0:2]

resultado
resultado = lenguajes[0:3]

resultado
resultado = lenguajes[:3]

resultado
resultado = lenguajes[2:5]

resultado
resultado = lenguajes[4:7]

resultado
resultado = lenguajes[4:len(lenguajes)]

resultado
resultado = lenguajes[4:]

resultado<jupyter_output><empty_output><jupyter_text>En la selección de varios elementos de una tupla se pueden utilizar índices negativos:<jupyter_code>resultado = lenguajes[-3:]

resultado<jupyter_output><empty_output><jupyter_text>Se puede utilizar el esquema de selección de todos los elementos con notación de slicing:<jupyter_code>lenguajes[:]<jupyter_output><empty_output><jupyter_text>Inmutabilidad de una tupla**IMPORTANTE**: Las tuplas no son modificables (inmutable).<jupyter_code>lenguajes
len(lenguajes)
# lenguajes[-1] = 'Julia' # Se produce el error TypeError al intentar modificar un elemento de una tupla.
try:
    lenguajes[-1] = 'Julia'
except TypeError as e:
    print('La modificación de una tupla no está permitida.')
    print(f'MENSAJE: {e}')
lenguajes = tuple(list(lenguajes[:-1]) + ['Julia'])

lenguajes<jupyter_output><empty_output><jupyter_text>Solución no. 2:<jupyter_code>lenguajes = ('Python', 'JavaScript', 'C++', 'Java', 'PHP', 'Go', 'C')

lenguajes
lenguajes = lenguajes[:-1] + ('Julia',)

lenguajes
numeros = (1, 2, 3, [4, 5, 6], 7)

numeros
type(numeros[0])
type(numeros[1])
type(numeros[3])
type(numeros[3])
numeros[3][1] = 5.5

numeros<jupyter_output><empty_output><jupyter_text>Operaciones sobre una tuplaFunciones comunes sobre un objeto (variable) de tipo tupla.<jupyter_code>numeros = (3, 2, 3, 3, 5, 3, 2, 2, 7, 11, 7, 5)

numeros<jupyter_output><empty_output><jupyter_text>Función `count(elemento)`Encuentra la cantidad de ocurrencias de un `elemento` en una tupla.<jupyter_code>tres = 3

cantidad = numeros.count(tres)

f'En la tupla "numeros" el valor {tres} aparece {cantidad} veces.'
cero = 0

cantidad = numeros.count(cero)

f'En la tupla "numeros" el valor {cero} aparece {cantidad} veces.'<jupyter_output><empty_output><jupyter_text>Función `index(elemento)`Encuentra el índice de un elemento en una tupla.<jupyter_code>indice = numeros.index(7)

f'El valor 7 se encuentra en el índice {indice}.'
indice = numeros.index(3)

f'El valor 3 se encuentra en el índice {indice}.'
try:
    indice = numeros.index(19)

    f'El valor 19 se encuentra en el índice {indice}.'
except ValueError as e:
    print('El valor 19 no se encuentra en la lista "numeros".')
    print(f'Error: {e}')<jupyter_output>El valor 19 no se encuentra la lista "numeros".
Error: tuple.index(x): x not in tuple<jupyter_text>Operador de pertenencia sobre las tuplasSirve para averiguar/consultar si un elemento está presente en una tupla.Nos referimos al operador `in`.<jupyter_code>numeros
if 19 in numeros:
    print(f'El valor 19 se encuentra en el índice {indice}.')
else:
    print('El valor 19 no se encuentra en la lista "numeros".')<jupyter_output>El valor 19 no se encuentra en la lista "numeros".<jupyter_text>**Comentario**: El operador `in` retorna un valor lógico (booleano).`true` cuando el elemento está presente en la tupla, `false` en caso contrario.<jupyter_code>19 in numeros
5 in numeros<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11030771817723221, 'fraction_numerical': 0.018328569026399864, 'mean_word_length': 6.398009950248756, 'pattern_counts': {'":': 0, '<': 78, '<?xml version=': 0, '>': 78, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '20', 'dir': 'jupyter-structured-clean-dedup', 'id': '262941', 'license': 'MIT', 'n_tokens_mistral': 2418, 'n_tokens_neox': 2398, 'n_words': 636, 'path': 'Taller001-Python-Intro/T001-05-Tuplas.ipynb', 'repo_name': 'Fhernd/PandasTallerManipulacionDatos', 'size': '5947'}