162 lines
3.4 KiB
Markdown
162 lines
3.4 KiB
Markdown
# Tuplas
|
|
|
|
Las tuplas son un tipo de dato para almacernar colecciones de datos
|
|
(collection data types: List, Tuple, Set, Dictionary)
|
|
|
|
Una tupla es: ordenada, inmutable, permite elementos duplicados
|
|
|
|
Ejemplos:
|
|
- [Creación](#creación)
|
|
- [Indice](#indice)
|
|
- [Operaciones sobre tuplas](#operaciones-sobre-tuplas)
|
|
- [Slicing](#slicing)
|
|
- [Empaquetado y Desempaquetado de tuplas](#empaquetado-y-desempaquetado-de-tuplas)
|
|
- [Comparativa entre lista y tupla](#comparativa-entre-lista-y-tupla)
|
|
|
|
### Creación
|
|
```python
|
|
# creación tupla vacía
|
|
mi_tupla = ()
|
|
|
|
# tupla con datos de distinto tipo
|
|
mi_tupla = ("Marcell", 33, 'Chillán')
|
|
|
|
# tupla con un solo elementos
|
|
mi_tupla = ('ojo la coma',)
|
|
|
|
# función tuple()
|
|
```python
|
|
mi_tupla = tuple()
|
|
|
|
# creación de tupla con un objeto iterable
|
|
mi_tupla = tuple(["Marcell", 33, "Chillán"])
|
|
```
|
|
|
|
### Indice
|
|
```python
|
|
# Indice 0, primer elemento
|
|
item = mi_tupla[0]
|
|
# "Marcell"
|
|
|
|
# Indice -1, último elemento
|
|
item = mi_tupla[-1]
|
|
# "Chillán"
|
|
|
|
# modficiar tupla
|
|
# error, tuples are inmutable
|
|
|
|
# iterar tupla, bucar 33
|
|
print('si') if 33 in mt else print('no')
|
|
```
|
|
|
|
### Operaciones sobre tuplas
|
|
```python
|
|
# largo tupla
|
|
len(mi_tupla)
|
|
|
|
# contar existencias de un item
|
|
mi_tupla = ('a', 'b', 'd', 'd')
|
|
mi_tupla.count('d')
|
|
# 2
|
|
|
|
# obenter el indice de la primera existencia un item
|
|
mi_tupla.index('d')
|
|
# 2
|
|
|
|
# ValueError
|
|
try:
|
|
msg = mi_tupla.index('x')
|
|
except ValueError:
|
|
msg = 'Elemento no pertenece a la tupla'
|
|
finally:
|
|
print(msg)
|
|
|
|
# convertir lista a tupla y viceversa
|
|
mi_lista = list(mi_tupla)
|
|
mi_tupla = tuple(mi_lista)
|
|
```
|
|
|
|
### Slicing
|
|
```py
|
|
# tupla[start_index:stop_index:step_index(opcional)]
|
|
a = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
|
|
|
# Desde index 1 a 5(el último no entra en el slice)
|
|
b = a[1:5]
|
|
# [2, 3, 4, 5]
|
|
|
|
# si no se especifica inicio, considera el indice 0
|
|
b = a[:5]
|
|
# [1, 2, 3, 4]
|
|
|
|
# si no se especifica el indice de detención, llega hasta el final
|
|
b = a[3:]
|
|
# [4, 5, 6, 7, 8, 9, 10]
|
|
|
|
# se puede especificar un indice de 'paso', para saltar cada cierta cantidad de elementos
|
|
rebanada = mi_lista[::3]
|
|
# [1, 4, 7, 10]
|
|
# o en sentido contrario
|
|
rebanada = mi_lista[::-3]
|
|
# [10, 7, 4, 1]
|
|
```
|
|
|
|
## Empaquetado y Desempaquetado de tuplas
|
|
```python
|
|
# empaquetado
|
|
mi_tupla = 'Marcell', 33, 'Chillán'
|
|
nombre, edad, destino = mi_tupla
|
|
|
|
# desempaquetado
|
|
mi_tupla = (0, 1, 2, 3, 4)
|
|
i1, *i2, i3 = mi_tupla # '*' representa todo lo que está en medio
|
|
# i1 = 0
|
|
# i2 = [1, 2, 3]
|
|
# i3 = 4
|
|
```
|
|
|
|
## Comparativa entre lista y tupla
|
|
```python
|
|
import sys
|
|
import timeit
|
|
|
|
# Comparativas entre tupla y lista
|
|
# (inmutable y mutable)
|
|
mi_lista = [0, 1, 2, 'hola', True]
|
|
mi_tupla = (0, 1, 2, 'hola', True)
|
|
|
|
# tamaño
|
|
sys.getsizeof(mi_lista)
|
|
# 96 bytes
|
|
sys.getsizeof(mi_tupla)
|
|
# 80 bytes
|
|
|
|
|
|
# tiempo de ejecución de 1 millón de listas y tuplas
|
|
timeit.timeit(stmt="[0, 1, 2, 3, 4, 5]", number=1000000)
|
|
# 0.08779324200440897
|
|
timeit.timeit(stmt="(0, 1, 2, 3, 4, 5)", number=1000000)
|
|
# 0.009468877004110254
|
|
```
|
|
|
|
Otra comparación de tamaño
|
|
```python
|
|
from timeit import default_timer as timer
|
|
|
|
start = timer()
|
|
lista_test = [i for i in range(1_000_000)]
|
|
end = timer()
|
|
print('Segs : ', end-start)
|
|
print('Mibs : ',sys.getsizeof(lista_test)/(1024*1024))
|
|
# Mibs : 8.057334899902344
|
|
# Segs : 0.03020415200444404
|
|
|
|
start = timer()
|
|
tupla_test = tuple(i for i in range(1_000_000))
|
|
end = timer()
|
|
print('Segs : ', end-start)
|
|
print('Mibs : ',sys.getsizeof(tupla_test)/(1024*1024))
|
|
# Segs : 0.04234340200491715
|
|
# Mibs : 7.629432678222656
|
|
```
|