terminar - for i in range python español
Bucle for-in Python precedido por una variable (4)
Es una lista de comprensión
foo
será una lista filtrada de la bar
contiene los objetos con el atributo ocupantes> 1
bar
puede ser una list
, set
, dict
o cualquier otro iterable
Aquí hay un ejemplo para aclarar
>>> class Bar(object):
... def __init__(self, occupants):
... self.occupants = occupants
...
>>> bar=[Bar(0), Bar(1), Bar(2), Bar(3)]
>>> foo = [x for x in bar if x.occupants > 1]
>>> foo
[<__main__.Bar object at 0xb748516c>, <__main__.Bar object at 0xb748518c>]
Así que foo tiene 2 objetos Bar
, pero ¿cómo verificamos cuáles son? Vamos a agregar un método __repr__
a Bar
para que sea más informativo
>>> Bar.__repr__=lambda self:"Bar(occupants={0})".format(self.occupants)
>>> foo
[Bar(occupants=2), Bar(occupants=3)]
foo = [x for x in bar if x.occupants > 1]
Después de buscar en Google y buscar aquí, no pude entender qué hace esto. Tal vez no estaba buscando lo correcto, pero aquí está. Cualquier comentario para desacreditar esta taquigrafía es muy apreciado.
Esto devuelve una lista que contiene todos los elementos en la barra que tienen ocupantes> 1.
La forma en que esto debería funcionar hasta donde yo sé es que comprueba si la lista "barra" está vacía (0) o consiste en un singleton (1) a través de x.occupants donde x es un elemento definido dentro de la barra de lista y puede tener la característica de ocupantes. Entonces se llama a foo, se mueve a través de la lista y luego devuelve todos los elementos que pasan la condición de verificación que es x.occupant.
En un lenguaje como Java, crearía una clase llamada "x" donde los objetos ''x'' se asignan a una matriz o similar. X tendría un campo llamado "ocupantes" y cada índice se verificaría con el método x.occupants, que devolvería el número asignado al ocupante. Si el método devuelve más de 1 (suponemos que un int aquí como un ocupante parcial sería impar.) El método foo (que se llama en la matriz o similar en cuestión) devolvería una matriz o similar como se define en el método foo para esta matriz de contenedores o lo que tienes. Los elementos de la matriz devuelta serían los objetos ''x'' en la primera cosa de matriz que se ajusta al criterio de "Mayor que 1".
Python tiene métodos integrados a través de la comprensión de listas para lidiar con esto de una manera mucho más sucinta y simplificada. En lugar de implementar dos clases completas y varios métodos, escribo esa línea de código.
Las respuestas actuales son buenas, pero no hablan de que son solo azúcar sintáctico para algún patrón al que estamos tan acostumbrados.
Comencemos con un ejemplo, digamos que tenemos 10 números, y queremos un subconjunto de aquellos que son mayores que, digamos, 5.
>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]
Para la tarea anterior, los siguientes enfoques a continuación son totalmente idénticos entre ellos, y van desde lo más detallado a lo conciso, lo legible y lo pitónico :
Enfoque 1
result = []
for index in range(len(numbers)):
if numbers[index] > 5:
result.append(numbers[index])
print result #Prints [12, 34, 67, 37, 9, 81]
Enfoque 2 (Ligeramente más limpio, bucles for-in)
result = []
for number in numbers:
if number > 5:
result.append(number)
print result #Prints [12, 34, 67, 37, 9, 81]
Enfoque 3 (Ingrese la comprensión de la lista)
result = [number for number in numbers if number > 5]
o más generalmente:
[function(number) for number in numbers if condition(number)]
dónde:
-
function(x)
toma unax
y la transforma en algo útil (como por ejemplo:x*x
) - si la
condition(x)
devuelve cualquier valor False-y (False, None, empty string, empty list, etc.), entonces la iteración actual se saltará (piense encontinue
). Si la función devuelve un valor que no sea False-y, el valor actual llega a la matriz final resultante (y pasa por el paso de transformación anterior).
Para comprender la sintaxis de una manera ligeramente diferente, mira la sección de bonificación a continuación.
Para obtener más información, siga el tutorial que todas las demás respuestas han vinculado: Comprensión de la lista
Prima
(Un poco antiponético, pero poniéndolo aquí en aras de la integridad)
El ejemplo anterior se puede escribir como:
result = filter(lambda x: x > 5, numbers)
La expresión general anterior se puede escribir como:
result = map(function, filter(condition, numbers)) #result is a list in Py2