5.1.4 Cuidado con las copias

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:

5.1.4 Cuidado con las copias

Ejecución paso a paso a través de Python Tutor:

https://cutt.ly/pfi5PC5

Nota: A través de Python Tutor se puede ver claramente el motivo de por qué ocurre esto. Dado que las variables «apuntan» a la misma zona de memoria, al modificar una de ellas, el cambio también se ve reflejado en la otra.

Una posible solución a este problema es hacer una «copia dura». Para ello Python proporciona la función copy():

5.1.4 Cuidado con las copias

Ejecución paso a paso a través de Python Tutor:

https://cutt.ly/Dfi6oLk

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.

5.1.5 Veracidad múltiple

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:

5.1.4 Cuidado con las copias

Veamos la versión con veracidad múltiple usando all(), donde se comprueba que se cumplan todas las expresiones:

5.1.4 Cuidado con las copias

Veamos la versión con veracidad múltiple usando any(), donde se comprueba que se cumpla alguna expresión:

5.1.4 Cuidado con las copias

Consejo: Este enfoque puede ser interesante cuando se manejan muchas condiciones o bien cuando queremos separar las condiciones y agruparlas en una única lista.

5.1.6 Listas por comprensión

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.

5.1.4 Cuidado con las copias

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í:

5.1.4 Cuidado con las copias

Ahora veamos el código utilizando una lista por comprensión:

5.1.4 Cuidado con las copias

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:

5.1.4 Cuidado con las copias

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:

5.1.4 Cuidado con las copias

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]

5.1.7 sys. argv

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:

5.1.4 Cuidado con las copias

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

5.1.4 Cuidado con las copias

5.1.4 Cuidado con las copias

Si lo ejecutamos obtenemos lo siguiente:

5.1.4 Cuidado con las copias

5.1.8 Funciones matemáticas

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():

5.1.4 Cuidado con las copias

Mínimo de todos los valores: Mediante la función min():

5.1.4 Cuidado con las copias

Máximo de todos los valores: Mediante la función max():

5.1.4 Cuidado con las copias

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:

5.1.4 Cuidado con las copias
Plantilla de código para el programa:

5.1.4 Cuidado con las copias

Ejemplo

  • Entrada: 32 56 21 99 12 17
  • Salida: 39.50
5.1.9 Listas de listas

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:

5.1.4 Cuidado con las copias
Y ahora las juntamos en una única lista:

5.1.4 Cuidado con las copias

Figura 4: Lista de listas (como equipo de fútbol)

5.1.4 Cuidado con las copias

Podemos comprobar el acceso a distintos elementos:

5.1.4 Cuidado con las copias

Ejercicio

Escriba un programa que permita multiplicar únicamente matrices de 2 filas por 2 columnas. Veamos un ejemplo concreto:

5.1.4 Cuidado con las copias

El producto P = A x B se calcula siguiendo la multiplicación de matrices tal y como se indica a continuación:

5.1.4 Cuidado con las copias

EJERCICIOS DE REPASO

  1. 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
  1. 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’]
  1. 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]
  1. 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]
  1. 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
  1. 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

Publicaciones Similares