2012-02-12 11 views
7

Acabo de comenzar a aprender el idioma de pitón largamente escuchado. He estado trabajando con C antes. Y encuentro Python, ya que un lenguaje de script moderno es muy conciso en varias tareas.¿Pitón tiene una abreviatura para esta simple tarea?

Me preguntaba si tengo una lista foo = [1, 2, 3, 4, 5], y quiero elegir todos los números impares en bar. En C, podría usar un ciclo y verificar cada número en foo y copiar los elementos necesarios en bar. ¿Qué hacen ustedes este "estilo de pitón"?

+1

para ese ejemplo particular puede utilizar foo [:: 2] también . – ChessMaster

+0

foo [:: 2] se llama "slice" en Python, busca esa palabra para entender mejor el ejemplo de ChessMaster. Funciona bien en este caso particular porque los números impares casualmente ocupan posiciones impares en la lista (incluso, para basado en cero). – mgibsonbr

+0

Ejecutar a través del tutorial oficial (http://docs.python.org/tutorial/). Es bastante corto y habría respondido esta pregunta. –

Respuesta

19
bar = [x for x in foo if x % 2 == 1] 

Este formulario se llama "list comprehension". En su forma básica, tiene 4 partes:

  1. Lo que desea incluir en la lista de resultados. Puede ser cualquier expresión que involucre la (s) variable (s) definida (s) en la segunda parte (abajo). En este caso, el elemento x, sin modificar;

  2. Una variable, o expresión, que denota un elemento de la lista de entrada. Después de la palabra clave para, cada elemento de la lista estará vinculado a esa variable (si su lista contiene objetos complejos, puede usar destructuring assignment para referirse solo a partes específicas de la misma). En este caso, cada elemento de la lista está limitado a x;

  3. La lista de entrada. Tras la palabra clave en, la lista (u otra iterable) de la que obtendrá sus elementos. En este caso, foo;

  4. Una condición que el elemento debe cumplir para incluirse en el resultado (opcional). Si está incluido, agregue la palabra clave si seguido de una expresión para determinar si ese elemento se incluirá o no en la lista de salida. En este caso, será si el número es impar.

+0

¿Cómo se llama esta estructura? Necesito un nombre para poder aprender esto en la documentación. – trVoldemort

+0

@trVoldemort Estaba actualizando mi respuesta (quería dar una respuesta rápida primero, luego elaborar ...), ahora hay más información. – mgibsonbr

+2

El '== 1' es innecesario. – nikow

4

filter función es lo que busca:

bar = filter(lambda x: x % 2 == 1, foo) 

La expresión lambda x: x % 2 == 1 es básicamente equivalente a

def isOdd(x): 
    return x % 2 == 1 
+0

¿Qué sucede si quiero que 'bar' sea' [1 * 2, 3 * 2, 5 * 2] '? ¿Puedo usar la expresión lambda para mapearlo? – trVoldemort

+0

No, necesitas usar la función 'map' para eso :) Puedes combinar' filter' y 'map' como' map (lambda x: x * 2, filter (lambda x: x% 2 == 1, foo)) 'o use la lista de comprensión según lo sugerido por mgibsonbr. –

+0

¡Gracias! ¿Hay una lista de lo que las expresiones lambda pueden hacer? Creo que la comprensión de la lista es corta y conveniente, pero no tan universal como lambda. – trVoldemort

Cuestiones relacionadas