# Listas Las listas son un tipo de dato que almacena colecciones de datos (collection data type). Collection data types: **List**, **Tuple**, **Set**, **Dictionary**. Es ordenada, mutable y permite elementos duplicados Ejemplos: - [Creación](#crear-lista) - [Explorar Lista](#explorar-lista) - [Editar Lista](#editar-lista) - [Slicing](#slicing) - [Copiar Lista](#copiar-lista) - [Comprensión de Listas](#comprensión-de-listas) ### Crear Lista ```python mi_lista = [] mi_lista = list() # Lista de strings mi_lista = ["lista", "de", "strings"] # Lista con datos de difente tipo mi_lista = [5, True, "palabra", "palabra"] # Lista con los mismos elementos multiples veces mi_lista = [0] * 5 # [0, 0, 0, 0, 0] ``` ### Explorar Lista ```python # Largo de lista largo_lista = len(mi_lista) # Indice 0, primer elemento item = mi_lista[0] # Indice -1, último elemento item = mi_lista[-1] # Fuera de indice try: item = mi_lista[10] except IndexError: item = "El indice solicitado esta fuera de rango" finally: print(item) # Recorrer listas for i in mi_lista: print(i) # Recorrer indice y elemento for x,i in enumerate(mi_lista): print(f"Indice {x}: {i}") # Comprobar si un item pertenece a la lista if "palabra" in mi_lista: print("si") else: print('no') ``` ### Editar Lista ```python # Añadir items (append items) mi_lista.append("laurel") # Insertar item en posición especifica mi_lista[3] = "cambio" # Obtener y emover ultimo item, pop mi_lista.pop() # Eliminar un item especifico (primera incidencia) mi_lista.remove("palabra") # Eliminar todos los elementos de la lista mi_lista.clear() mi_lista = [3, 2, 1, 0, 5, 6, 4, 8, 9, 7] # Revertir orden mi_lista.reverse() # preservar lista original nueva_lista = reversed(mi_lista) # Ordernar lista mi_lista.sort() # preservar list original nueva_lista = sorted(mi_lista) # Concatenar listas mi_lista2 = [1, 2, 3, 4] nueva_lista = mi_lista + mi_lista2 #nueva lista = [0, 0, 0, 0, 0, 1, 2, 3, 4] ``` ### Slicing ```python # lista[start_index:stop_index:step_index(opcional)] mi_lista = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Desde index 1 a 5(el último no entra en el slice) rebanada = mi_lista[1:5] # [1, 2, 3, 4] # si no se especifica inicio, considera el indice 0 rebanada = mi_lista[:5] # [0, 1, 2, 3] # si no se especifica el indice de detención, llega hasta el final rebanada = mi_lista[3:] # [3, 4, 5, 6, 7, 8, 9] # se puede especificar un indice de 'paso', para saltar cada cierta cantidad de elementos rebanada = mi_lista[::3] # [0, 3, 6, 9] # o en sentido contrario rebanada = mi_lista[::-3] # [9, 6, 3, 0] ``` ### Copiar lista ```python lista_orig = ["platano", "cereza", "manazana"] # esta asignación hace referencia al mismo punto en la memoria # cualquier cambio en la list_copia afecta tb a la original. list_copia = lista_orig # Copiar lista en variable independiente list_copia = list(lista_orig) # también se puede utilizar slicing list_copia = lista_orig[:] ``` ### Comprensión de Listas ```python # Simplicación de la expresión utilizada para crear listas mi_lista = [1, 2, 3, 4, 5] # Crear lista con los cuadrados de cada elemento de la lista original lista_cuadrados = [i * i for i in mi_lista] # [1, 4, 9, 16, 25] # lista_cuadrados = [] # for i in mi_lista: # lista_cuadrados.append(x*x) ``` Comprensión de lista usando una función ```python def cubo(i): return i*i*i cubos = [cubo(i) for i in range(5)] # [0, 1, 8, 27, 64] ``` Comprensión de lista y condición ```python # compresion de lista condicional en for impares = [i for i in range(20) if i%2!=0] # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] # compresion de lista condicional en expresión a = [1,2,3,4,5,6,7,8,9] b = [0 if i < 5 else i for i in a] # [0,0,0,0,5,6,7,8,9] ``` ### Comprensión de lista o generador ```python # en ocasiones es mejor utilizar un generador # comprobar tiempo y uso de memoria from timeit import default_timer as timer import sys start = timer() list_compr = [i*i for i in range(1_000_000)] end = timer() print('segundos : ', end-start) print('bytes : ', sys.getsizeof(list_compr)) # segundos : 0.04858550600329181 # bytes : 800984 start = timer() obj_generador = (i*i for i in range(1_000_000)) end = timer() print('segundos : ', end-start) print('bytes : ', sys.getsizeof(obj_generador)) # segundos : 3.1479939934797585e-06 # bytes : 112 ```