2010-11-20 23 views
6

En cuanto a este fragmento de código Python que escribió:¿Hay alguna forma mejor de hacer este código python?

return map(lambda x: x[1], 
      filter(lambda x: x[0] == 0b0000, 
        my_func(i) 
       ) 
     ) 

(Con la esperanza de que es auto-explicativo)

Me pregunto si pitón tiene una mejor manera de hacerlo?

Aprendí Python hace varios meses, escribí un par de guiones, y no lo he usado mucho desde entonces. Me pone en un lugar extraño para aprender porque sé lo suficiente como para hacer lo que quiero, pero no tengo el instinto de novato de encontrar el camino "apropiado". Estoy esperando que esta pregunta me pondrá de nuevo en marcha ...

+0

Asumo 'mi_func()' devuelve una lista de las listas? –

Respuesta

9

Creo desea una lista por comprensión:

[x[1] for x in my_func(i) if x[0] == 0] 

Las comprensiones de listas son una expresión extremadamente común de Python.

2

Se podría utilizar algo como:

return [x[1] for x in my_func(i) if x[0] == 0b0000] 

Mucha gente llamaría a eso "mejor" ya que es un poco más corto y más obvia.

(.. Yo estaría tentado a considerar convirtiéndolo en un bucle simple y si la declaración de programación funcional es agradable, pero bucles simples son también muy bueno)

+0

¿Cómo es mejor o más obvio un bucle 'for'? La lista de comprensión es mucho más legible una vez que te acostumbras. – aaronasterling

+1

¿Está destinado a asignar 'x [0]'? ¿o es eso para ser '=='? –

+1

@Russell Dias: Quiere decir '==' porque es un error de sintaxis de lo contrario. –

1

Si está escribiendo en 3.x Python, entonces se podría escribir una expresión eficiente generador como este: return (x[1] for x in my_func(i) if not x[0])

+5

¿Por qué dices "Python 3.x"? Eso funcionaría bien en Python 2. –

+0

Hay una diferencia entre 'map' en Python 2.xy 3.x. La última vez que revisé, 'map' en 2.x devolvió una lista pero funciona como un generador en 3.x. –

1

En 3.x pitón puede utilizar el desembalaje de evitar el uso x[0] y x[1]. También puede considerar la posibilidad de devolver un generador de expresión en lugar de una lista-comprensión si sólo desea bucle sobre el resultado vez:

return (y for x,y,*z in my_func(i) if x == 0b0000) 
Cuestiones relacionadas