5.1.4 Cuidado con las copias
Nivel intermedio
Las listas son estructuras de datos mutables y esta característica nos obliga a tener cuidado cuando realizamos copias de listas, ya que la modificación de una de ellas puede afectar a la otra.
Veamos un ejemplo sencillo:
Ejecución paso a paso a través de Python Tutor:
Una posible solución a este problema es hacer una «copia dura». Para ello Python proporciona la función copy():
Ejecución paso a paso a través de Python Tutor:
Truco: En el caso de que estemos trabajando con listas que contienen elementos mutables, debemos hacer uso de la función deepcopy() dentro del módulo copy de la librería estándar.
Si bien podemos usar sentencias condicionales para comprobar la veracidad de determinadas expresiones, Python nos ofrece dos funciones «built-in» con las que podemos evaluar si se cumplen todas las condiciones all() o si se cumple alguna condición any(). Estas funciones trabajan sobre iterables, y el caso más evidente es una lista.
Supongamos un ejemplo en el que queremos comprobar si una determinada palabra cumple las siguientes condiciones:
- Su longitud total es mayor que 4.
- Empieza por «p».
- Contiene, al menos, una «y».
Veamos la versión clásica:
Veamos la versión con veracidad múltiple usando all(), donde se comprueba que se cumplan todas las expresiones:
Veamos la versión con veracidad múltiple usando any(), donde se comprueba que se cumpla alguna expresión:
Consejo: Este enfoque puede ser interesante cuando se manejan muchas condiciones o bien cuando queremos separar las condiciones y agruparlas en una única lista.
Nivel intermedio
Las listas por comprensión establecen una técnica para crear listas de forma más compacta basándose en el concepto matemático de conjuntos definidos por comprensión.
Figura 2: Estructura de una lista por comprensión
En primer lugar veamos un ejemplo en el que convertimos una cadena de texto con valores numéricos en una lista con los mismos valores pero convertidos a enteros. En su versión clásica haríamos algo tal que así:
Ahora veamos el código utilizando una lista por comprensión:
Condiciones en comprensiones
También existe la posibilidad de incluir condiciones en las listas por comprensión.
Continuando con el ejemplo anterior, supongamos que sólo queremos crear la lista con aquellos valores que empiecen por el dígito 4:
Anidamiento en comprensiones
Nivel avanzado
En la iteración que usamos dentro de la lista por comprensión es posible usar bucles anidados. Veamos un ejemplo en el que generamos todas las combinaciones de una serie de valores:
Consejo: Las listas por comprensión son una herramienta muy potente y nos ayuda en muchas ocasiones, pero hay que tener cuidado de no generar expresiones excesivamente complejas. En estos casos es mejor una aproximación clásica.
Ejercicio
Utilizando listas por comprensión, cree una lista que contenga el resultado de aplicar la función f (x) = 3x + 2 para x E [0, 20).
Salida esperada: [2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59]
Cuando queramos ejecutar un programa Python desde línea de comandos, tendremos la posibilidad de acceder a los argumentos de dicho programa. Para ello se utiliza una lista que la encontramos dentro del módulo sys y que se denomina argv:
Veamos una aplicación de lo anterior en un programa que convierte un número decimal a una determinada base, ambos argumentos pasados por línea de comandos:
dec2base.py import sys
Si lo ejecutamos obtenemos lo siguiente:
Python nos ofrece, entre otras, estas tres funciones matemáticas básicas que se pueden aplicar sobre listas.
Suma de todos los valores: Mediante la función sum():
Mínimo de todos los valores: Mediante la función min():
Máximo de todos los valores: Mediante la función max():
Ejercicio
Lea desde línea de comandos una serie de números y obtenga la media de dichos valores (muestre el resultado con 2 decimales).
La llamada se haría de la siguiente manera:
Plantilla de código para el programa:
Ejemplo
- Entrada: 32 56 21 99 12 17
- Salida: 39.50
Nivel intermedio
Como ya hemos visto en varias ocasiones, las listas son estructuras de datos que pueden contener elementos heterogéneos. Estos elementos pueden ser a su vez listas.
A continuación planteamos un ejemplo del mundo deportivo. Un equipo de fútbol suele tener una disposición en el campo organizada en líneas de jugadores. En aquella alineación con la que España ganó la copa del mundo en 2010 había una disposición 4-3-3 con los siguientes jugadores:
Veamos una posible representación de este equipo de fútbol usando una lista compuesta de listas. Primero definimos cada una de las líneas:
Y ahora las juntamos en una única lista:
Figura 4: Lista de listas (como equipo de fútbol)
Podemos comprobar el acceso a distintos elementos:
Ejercicio
Escriba un programa que permita multiplicar únicamente matrices de 2 filas por 2 columnas. Veamos un ejemplo concreto:
El producto P = A x B se calcula siguiendo la multiplicación de matrices tal y como se indica a continuación:
EJERCICIOS DE REPASO
- Escriba un programa en Python que acepte una lista de valores numéricos y obtenga s
- Entrada: [6, 3, 9, 2, 10, 31, 15, 7]
- Salida: 31
- Escriba un programa en Python que acepte una lista y elimine sus elementos duplicad[1]
- Entrada: [’this’, ’is’, ’a’, ‘real’, ‘real’, ‘real’, ’story’]
- Salida: [’this’, ’is’, ’a’, ‘real’, ’story’]
- Escriba un programa en Python que acepte una lista — que puede contener sublistas (s
- Entrada: [0, 10, [20, 30], 40, 50, [60, 70, 80], [90, 100, 110,120]]
- Salida: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
- Escriba un programa en Python que acepte una lista y genere otra lista eliminando los
- Entrada: [0, 0, 1, 2, 3, 4, 4, 5, 6, 6, 6, 7, 8, 9, 4, 4]
- Salida: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 4]
- Escriba un programa en Python que acepte una lista de valores numéricos y devuelva
- Entrada: [1, 1, 1, 1, 1, 1, 1]
- Salida: Iguales
- Escriba un programa en Python que acepte una lista de listas representando una matr
- Entrada: [[4, 6, 1], [2, 9, 3], [1, 7, 7]]
- Salida: 20
AMPLIAR CONOCIMIENTOS
- Linked Lists in Python: An Introduction
- Python Command Line Arguments
- Sorting Data With Python
- When to Use a List Comprehension in Python
- Using the Python zip() Function for Parallel Iteration
- Lists and Tuples in Python
- How to Use sorted() and sort() in Python
- Using List Comprehensions Effectively