Enrique Gálvez
Nahuel Castro
David Gallego
Las listas en Python son una de las estructuras de datos más usadas: permiten agrupar valores heterogéneos, modificar elementos y escribir código más legible. Aquí verás cómo inicializarlas, mutarlas, iterarlas y copiarlas sin efectos inesperados, con ejemplos claros y prácticos.
¿Qué son las listas en Python y por qué importan?
Las listas son una secuencia mutable que puede contener cualquier tipo de dato: enteros, strings, objetos o incluso otras listas. Al crear listas de listas, puedes construir matrices para representar datos en dos o más dimensiones. A diferencia de los strings, que son inmutables, las listas permiten cambiar sus elementos por índice, agregar o eliminar valores y recorrerlos con un for loop.
¿Qué diferencia a listas y strings como secuencias?
Ejemplos en Python:
# Inicialización literal con *square brackets* countries = ["México", "Venezuela", "Colombia", "Argentina"] ages = [12, 18, 24, 34, 50] # Inicialización funcional con la *built in function* list() empty = list() # Lista heterogénea (receta): nombre y cantidades receta = ["ensalada", 2, "lechugas", 5, "jitomates"] # Mutabilidad: reasignación por índice countries[0] = "Ecuador" print(countries) # ["Ecuador", "Venezuela", "Colombia", "Argentina"] # Inmutabilidad de string: esto lanza un TypeError name = "David" # name[0] = "d" # TypeError: los strings no permiten asignación por índice
¿Cómo se inicializan e iteran listas en Python?
Puedes crear listas de forma literal con [] o con list(). Una vez en memoria, las recorres con un for simple y legible. A diferencia de range, que produce un iterador, una lista ya contiene los valores en memoria.
# Literal vs funcional nums_literal = [1, 2, 3] nums_funcional = list((1, 2, 3)) # a partir de un iterable # Iteración sobre una lista existente en memoria for country in countries: print(country) # Comparación conceptual con range (range genera un iterador) for n in range(5): print(n)
¿Qué significa que las listas sean referenciales y cómo copiar sin efectos secundarios?
En Python, las listas son referenciales: almacenan referencias a los objetos en memoria, no los objetos en sí. Por eso, dos listas con los mismos valores son objetos distintos; su identidad en memoria difiere. Con strings iguales, la identidad puede coincidir según lo mostrado con la built in function ID.
¿Qué es un alias y por qué puede causar bugs?
Asignar una lista a otra variable crea un alias: ambas variables apuntan a la misma lista. Modificar una, modifica la otra.
countries = ["México", "Venezuela", "Colombia", "Argentina"] global_countries = countries # alias: misma referencia countries[0] = "Guatemala" print(countries) # ["Guatemala", "Venezuela", "Colombia", "Argentina"] print(global_countries) # También cambia: misma lista en memoria
¿Cómo copiar una lista de forma segura con el módulo copy?
Para evitar efectos colaterales, usa el módulo copy y crea una copia nueva.
import copy countries = ["México", "Venezuela", "Colombia", "Argentina"] # Copia segura (nueva lista con los mismos valores) global_countries = copy.copy(countries) countries[0] = "Honduras" print(countries) # ["Honduras", "Venezuela", "Colombia", "Argentina"] print(global_countries) # ["México", "Venezuela", "Colombia", "Argentina"]
¿Te quedó alguna duda sobre mutabilidad, alias o el for loop en listas? Comparte tu pregunta y cuéntame qué casos prácticos quieres explorar.
Enrique Gálvez
Nahuel Castro
David Gallego
Jahir Rodriguez
Aarón Espasandín
Johanna Sanchez Vallejo
Guillermo García López
Alexander Román
Jorge Andres Muñoz Becerra
Omar Rodríguez Aldama
juan cabrera
Rhonal Velasco
freddy molleda
Carlos Enrique Ramírez Flores
Luis Castañeira
Omar Daniel Centeno
Daniel Correa
Omar Perez
Angel de Jesus Quintero Pereira
Omar Rodríguez Aldama
Mauricio Gonzalez Falcon
Iraida Mercedes Barreto Díaz
Iraida Mercedes Barreto Díaz
Marco Navarro
Orlando Ramirez
Alvaro Daniel Pita Peralta
Iram Martinez
Aaron Barreto Lezama
Manuel Rivera
Andrés Felipe Mesa David
Pablo Aquino
Francisco Javier Pecino Leon
Omar Daniel Centeno
Omar Rodríguez Aldama
Danilo Toro
Facundo Nicolás García Martoni
ProfesorDanilo Toro
Matias Niz
Raul Flores
Tambien se puede generar una copia de la lista con lista[::]
paises Out[20]: ['España', 'Alemania', 'Suiza'] eu = paises[::] paises[0] = 'Portugal' paises Out[23]: ['Portugal', 'Alemania', 'Suiza'] eu Out[24]: ['España', 'Alemania', 'Suiza']
Esa es la mejor manera de copiar una lista, no es necesario importar copy. Lo he visto siempre de la manera que lo escribiste arriba.
Mismo solo con una vez los dos puntos:
lista = [1, 2, 3, 4, 5] mi_lista = lista[:]
Cuidado Fuente de Bugs!!!
Cuando se hace una lista igual a otra, al cambiar una se modifica también la otra:
countries = ['Ecuador','Venezuela','Colombia','Argentina']
global_countries = countries
countries[0] = 'Guatemala'
countries
’Guatemala’, ‘Venezuela’, ‘Colombia’, ‘Argentina’]
global_countries
[‘Guatemala’, ‘Venezuela’, ‘Colombia’, ‘Argentina’]
global_countries[3] = 'Panama'
countries
[‘Guatemala’, ‘Venezuela’, ‘Colombia’, ‘Panama’]
global_countries
[‘Guatemala’, ‘Venezuela’, ‘Colombia’, ‘Panama’]``
Para evitarlo se debe utilizar la libreria copy
import copy
global_countries = None
global_countries = copy.copy(countries)
countries
[‘Guatemala’, ‘Venezuela’, ‘Colombia’, ‘Panama’]
global_countries
[‘Guatemala’, ‘Venezuela’, ‘Colombia’, ‘Panama’]
countries[0] = 'Honduras'
countries
[‘Honduras’, ‘Venezuela’, ‘Colombia’, ‘Panama’]
global_countries
[‘Guatemala’, ‘Venezuela’, ‘Colombia’, ‘Panama’]
Desde python 3.3 no es necesario utilizar esa librería, si no que podemos utilizar el método list.copy(). Ej.:
global_countries = countries.copy()
Ésta sintaxis es más legible y hace que no necesites importar librerías. Yo lo utilizo mucho al trabajar con numpy.
Diferentes formas de copiar una lista
Este hilo detalla las formas de copiar una lista
++Copy the list, you have various possibilities: ++
new_list = old_list.copy()
new_list = old_list[:]
new_list = list(old_list)
import copy new_list = copy.copy(old_list)
import copy new_list = copy.deepcopy(old_list)
Gran aporte gracias.
:o
Jugando un poco encontré que aunque si bien las listas son objetos que viven en diferentes lugares en la memoria, los objetos que contienen si son iguales vivirán en el mismo lugar en memoria, por ejemplo:
Python 3.6.9 (default, Nov 7 2019, 10:44:02) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a =[1,2,3,4,5] >>> b = [1,2,3,4,5] >>> id(a[0]) 10914496 >>> id(b[0]) 10914496 >>> 140264765992776 >>> id(b) 140264766007112 >>> el id de a y de b son diferentes, pero id(a[0]) y id(b[0]) son iguales
Cosas curiosas que uno encuentra!
buenisimo el aporte
para los que vienen de otros lenguajes las list se manejan como arrays en otros lenguajes no es lo mismo pero es parecido para comprenderlo
Si es verdad. En el curso anterior se explico eso, pero no esta de mas la aclaracion
otra manera de copiar objetos iterables como listas o strings es utilizando la notación slice [::] por ejemplo
countries = ["v","m","c"] global_countries = countries[::]
con esta notación obtenemos el mismo resultado que utilizar la libreria copy
Gracias, esto es importante saberlo!
Cuando vi que Aroesti se cambio la camisa, contesto indirectamente a mi pregunta, de si grabo todo el curso en una jornada.
Hay veces que Aroesti se ha aventado creo hasta 16 clases en un día... brutal. Todo el trabajo de claridad y preparación previo más el aguante estar al frente de la cámara explicando. Más algunos redbulls para aguantar jajajjaa
Tambien se puede copiar una lista asi, nueva_lista = vieja_lista.copy()
Creo que seria mejor si se usa la palabra, iterar en ves de ciclar no se pero se escucha bastante extraño xD
una lista es un objeto que funciona como iterador
excelente aporte
No es eso en sí, de hecho por defecto, las listas usan un método iter()
El cual es detectado por el interprete al hacer una iteración, recorriendo cada elemento de la lista, string, objeto, etc....
Si se quieren modificar los elementos de una dos listas que comparten los mismos elementos, y que cuando se haga dicho cambio solo afecte a la lista que estamos modificando, se utiliza el modulo copy.
Crear una variable que tome el valor de la lista para que ambas variables apunten al mismo valor en memoria. Si se cambia un elemento de la lista, se cambia en las dos variables.
En esta pagina viene un poco mas de informacion sobre el uso de listas: https://automatetheboringstuff.com/2e/chapter4/ ..Me parece interesante como complemento al video…
Este libro es excelente, totalmente recomendado, además de que trae varios ejercicios que aparte de ser útiles son bastante interesantes.
Qué es un CRUD?
Un CRUD son las operaciones principales de una base de datos. Las siglas quieren decir: C: Create - Crear registros R: Read- Leer registros U: Update - Actualizar registros D: Delete - Eliminar registros
Es una aplicacion, puede ser web como trello, o puede ser para desktop o para telefonos moviles donde puedes Crear una tarea o un parrafo que queda registrado y lo puedes Leer que en ingles se escribe Read o lo puedes Actualizar, traducido al ingles es Update y puedes eliminar el parrafo o lo registrado, en ingles borrar o eliminar es Delete. Y de ahi sale el acrónimo de C R U D.
Hay muchas formas de copiar valores para no apuntar a la misma referencia en memoria, pero cuál es mejor ? en cuestion de rendimiento, escalabilidad, etc. Importando el módulo copy, el método copy de lista[], por slices, etc. ?
En este artículo puedes ver cuál sería la mejor manera teniendo en cuenta el tiempo de ejecución: https://www.geeksforgeeks.org/python-cloning-copying-list/
Gracias por el dato.
Casos para declarar una lista que depende del original y cuando podemos hacer una copia independiente
import copy lista=[1,2,3,4] lista_dependiente = lista lista_independiente1 = lista.copy() lista_independiente2 = lista[:] print ("lista: ",lista,"\nlista_dependiente: ", lista_dependiente,"\nlista_independiente1: ",lista_independiente1,"\nlista_independiente2: ",lista_independiente2) lista[0] = 0 print ("\nlista: ",lista,"\nlista_dependiente: ", lista_dependiente,"\nlista_independiente1: ",lista_independiente1,"\nlista_independiente2: ",lista_independiente2)
Resultado:
lista: [1, 2, 3, 4] lista_dependiente: [1, 2, 3, 4] lista_independiente1: [1, 2, 3, 4] lista_independiente2: [1, 2, 3, 4] lista: [0, 2, 3, 4] lista_dependiente: [0, 2, 3, 4] lista_independiente1: [1, 2, 3, 4] lista_independiente2: [1, 2, 3, 4]
l
Estructuras de Datos con Python 🐉
.
Las estructuras de datos estándar que incorpora Python son: list, tuple, dict, y set.
.
En estas clases veremos el uso de las listas las cuales pueden aplicar diferentes métodos para aumentar su funcionalidad. Los métodos son:
append(). Agrega un elemento al final de la lista.
list.append(item)
clear(). Quita todos los elementos de la lista.
list.clear()
copy(). Regresa (copia), los elementos de la lista.
new_list = list.copy()
count(). Regresa el número de veces que un elemento aparece en la lista.
list.count(element)
extend(). Agrega elementos de un iterable(lista, tupla, string, etc) al final de la lista actual.
list1.extend(iterable)
index() Regresa el índice del primer elemento con el valor espcificado.
list.index(element, start, end)
insert(). Agrega elementos en una posición de índice específica.
list.insert(i, elem)
pop(). Quita elementos de una posición específica y permite agregarlos a otra lista.
list.pop(index)
remove(). Elimina el primer elemento que encuentra en la lista con el valor dado. Regresa None.
list.remove(element)
reverse(). Invierte el orden de la lista. No toma argumentos.
list.reverse()
sort(). Ordena la lista de forma ascendente o descendente(reverse = True). No retorna valores.
list.sort(key=..., reverse=...)
tip para crear listas con range
definimos una variable que contenga a range
mi_lista = = range(10)
y pasamos la variable por la función list
list(mi_lista)
listo tendremos este output
print(mi_lista)
out
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Creo que no es necesario importar copy, las listas tienen un metodo llamado copy(), para copiar
global_countries = country.copy()
También puedes usar slices para copiar una lista sin necesidad de utilizar ningún método, así:
list_2 = list_1[:]
@facmartoni Excelente D: no lo sabía
min 2:20, si son mutables porque el slider dice my_list[2] = 6? si previamente se le asigno a my_list = [1, 2, 3]?
Justamente por que son mutables (que pueden cambiar)
#esta haciendo la declaracion de la lista my_list = [1, 2, 3] #luego esta haciendo una asignacion a la tercera "casilla" de esa lista my_list[2] = 6 #si imprime esta cadena te daria [1, 2, 6]