Python – Comprensión de listas

La comprensión de una lista de Python consta de corchetes que contienen la expresión, que se ejecuta para cada elemento junto con el bucle for para iterar sobre cada elemento de la lista de Python

La comprensión de Python List proporciona una sintaxis mucho más corta para crear una nueva lista basada en los valores de una lista existente.

Ventajas de la comprensión de listas

  • Más eficiente en tiempo y espacio que los bucles.
  • Requiere menos líneas de código.
  • Transforma la declaración iterativa en una fórmula.

Sintaxis de comprensión de listas

newList = [ expresión(elemento) for elemento en oldList if condition ] 

Ejemplo de comprensión de listas en Python

Ejemplo 1: iteración con comprensión de lista

Python3

# Using list comprehension to iterate through loop
List = [character for character in [1, 2, 3]]
 
# Displaying list
print(List)

Producción:

[1, 2, 3]

Ejemplo 2: lista par usando comprensión de lista

Python3

list = [i for i in range(11) if i % 2 == 0]
print(list)

Producción:

[0, 2, 4, 6, 8, 10]

Ejemplo 3: Array usando comprensión de listas

Python3

matrix = [[j for j in range(3)] for i in range(3)]
   
print(matrix)

Producción:

[[0, 1, 2], [0, 1, 2], [0, 1, 2]]

Lista de comprensiones vs For Loop

Hay varias formas de iterar a través de una lista. Sin embargo, el enfoque más común es usar el bucle for . Veamos el siguiente ejemplo:

Python3

# Empty list
List = []
 
# Traditional approach of iterating
for character in 'Geeks 4 Geeks!':
    List.append(character)
 
# Display list
print(List)

Producción:

['G', 'e', 'e', 'k', 's', ' ', '4', ' ', 'G', 'e', 'e', 'k', 's', '!']

Arriba está la implementación del enfoque tradicional para iterar a través de una lista, string, tupla, etc. Ahora la comprensión de listas hace la misma tarea y también hace que el programa sea más simple. 

Las Comprensiones de listas traducen el enfoque de iteración tradicional utilizando for loop en una fórmula simple, lo que las hace fáciles de usar. A continuación se muestra el enfoque para iterar a través de una lista, string, tupla, etc. utilizando la comprensión de listas.

Python3

# Using list comprehension to iterate through loop
List = [character for character in 'Geeks 4 Geeks!']
 
# Displaying list
print(List)

Producción:

['G', 'e', 'e', 'k', 's', ' ', '4', ' ', 'G', 'e', 'e', 'k', 's', '!']

Análisis de tiempo en comprensión de listas y bucle

Las listas por comprensión son más eficientes tanto computacionalmente como en términos de espacio y tiempo de codificación que un bucle for a. Por lo general, se escriben en una sola línea de código. El siguiente programa muestra la diferencia entre los bucles for y la comprensión de listas en función del rendimiento.

Python3

# Import required module
import time
 
 
# define function to implement for loop
def for_loop(n):
    result = []
    for i in range(n):
        result.append(i**2)
    return result
 
 
# define function to implement list comprehension
def list_comprehension(n):
    return [i**2 for i in range(n)]
 
 
# Driver Code
 
# Calculate time takens by for_loop()
begin = time.time()
for_loop(10**6)
end = time.time()
 
# Display time taken by for_loop()
print('Time taken for_loop:', round(end-begin, 2))
 
# Calculate time takens by list_comprehension()
begin = time.time()
list_comprehension(10**6)
end = time.time()
 
# Display time taken by for_loop()
print('Time taken for list_comprehension:', round(end-begin, 2))

Producción:

Time taken for_loop: 0.56
Time taken for list_comprehension: 0.47

Del programa anterior, podemos ver que las listas de comprensión son bastante más rápidas que las del ciclo for.

Comprensiones de listas anidadas

Las comprensiones de lista anidadas no son más que una comprensión de lista dentro de otra comprensión de lista que es bastante similar a los bucles for anidados. A continuación se muestra el programa que implementa el bucle anidado:

Python3

matrix = []
 
for i in range(3):
 
    # Append an empty sublist inside the list
    matrix.append([])
 
    for j in range(5):
        matrix[i].append(j)
 
print(matrix)

Producción

[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

Ahora, mediante el uso de comprensiones de listas anidadas, se puede generar el mismo resultado en menos líneas de código.

Python3

# Nested list comprehension
matrix = [[j for j in range(5)] for i in range(3)]
 
print(matrix)
Producción

[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

Comprensiones de lista y Lambda

Las expresiones lambda no son más que representaciones abreviadas de las funciones de Python. El uso de listas de comprensión con lambda crea una combinación eficiente. Veamos los siguientes ejemplos:

Python3

# using lambda to print table of 10
numbers = []
 
for i in range(1, 6):
    numbers.append(i*10)
 
print(numbers)
Producción

[10, 20, 30, 40, 50]

Aquí, hemos usado for loop para imprimir una tabla de 10.

Python3

numbers = [i*10 for i in range(1, 6)]
 
print(numbers)

 Producción:

[10, 20, 30, 40, 50]

 Ahora aquí, hemos usado solo la comprensión de listas para mostrar una tabla de 10.

Python3

# using lambda to print table of 10
numbers = list(map(lambda i: i*10, [i for i in range(1, 6)]))
 
print(numbers)

Producción:

[10, 20, 30, 40, 50]

Finalmente, usamos lambda + lista de comprensión para mostrar la tabla de 10. Esta combinación es muy útil para obtener soluciones eficientes en menos líneas de código para problemas complejos.

Condicionales en la comprensión de listas

También podemos agregar declaraciones condicionales a la lista de comprensión. Podemos crear una lista usando range(), operadores , etc. y también podemos aplicar algunas condiciones a la lista usando la instrucción if .

Puntos clave

  • La comprensión de la lista es un medio efectivo para describir y construir listas basadas en listas actuales.
  • En general, la comprensión de listas es más liviana y simple que las funciones y bucles de formación de listas estándar.
  • No debemos escribir códigos largos para la comprensión de listas para garantizar un código fácil de usar.
  • Cada comprensión de la lista se puede reescribir en un bucle for, pero en el contexto de la interpretación de la lista, cada bucle for no se puede reescribir.

A continuación se muestran algunos ejemplos que representan el uso de listas de comprensión en lugar del enfoque tradicional para iterar a través de iterables:

Ejemplo 1: Comprensión de listas de Python usando If-else

Python3

lis = ["Even number" if i % 2 == 0
       else "Odd number" for i in range(8)]
print(lis)

Producción:

['Even number', 'Odd number', 'Even number', 'Odd number', 'Even number',
 'Odd number', 'Even number', 'Odd number']

Ejemplo 2: IF anidado con comprensión de lista

Python3

lis = [num for num in range(100)
       if num % 5 == 0 if num % 10 == 0]
print(lis)

Producción:

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

Ejemplo 3: Muestra un cuadrado de números del 1 al 10.

Python3

# Getting square of from 1 to 10
squares = [n**2 for n in range(1, 11)]
 
# Display square of even numbers
print(squares)

Producción

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Ejemplo 4: Transposición de visualización de array 2D.

Python3

# Assign matrix
twoDMatrix = [[10, 20, 30],
              [40, 50, 60],
              [70, 80, 90]]
 
# Generate transpose
trans = [[i[j] for i in twoDMatrix] for j in range(len(twoDMatrix))]
 
print(trans)

Producción:

[[10, 40, 70], [20, 50, 80], [30, 60, 90]]

Ejemplo 5: cambia el caso de cada carácter en una string.

Python3

# Initializing string
string = 'Geeks4Geeks'
 
# Toggle case of each character
List = list(map(lambda i: chr(ord(i) ^ 32), string))
 
# Display list
print(List)

Producción

['g', 'E', 'E', 'K', 'S', '\x14', 'g', 'E', 'E', 'K', 'S']

Ejemplo 6: invertir cada string en una tupla.

Python3

# Reverse each string in tuple
List = [string[::-1] for string in ('Geeks', 'for', 'Geeks')]
 
# Display list
print(List)

Producción:

['skeeG', 'rof', 'skeeG']

Ejemplo 7: Muestra la suma de dígitos de todos los elementos impares en una lista.

Python3

# Explicit function
def digitSum(n):
    dsum = 0
    for ele in str(n):
        dsum += int(ele)
    return dsum
 
 
# Initializing list
List = [367, 111, 562, 945, 6726, 873]
 
# Using the function on odd elements of the list
newList = [digitSum(i) for i in List if i & 1]
 
# Displaying new list
print(newList)

Producción:

[16, 3, 18, 18]

Publicación traducida automáticamente

Artículo escrito por riturajsaha y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *