2012-03-22 7 views
33

empecé a leer sobre underscore.js hoy, es una biblioteca JavaScript que agrega algunas golosinas de programación funcional que estoy acostumbrado a usar en Python. Un método abreviado es bastante fresco pluck.Pluck en Python

hecho en Python que a menudo necesitan para arrancar algún atributo específico, y terminan haciendo esto:

users = [{ 
    "name" : "Bemmu", 
    "uid" : "297200003" 
}, 
{ 
    "name" : "Zuck", 
    "uid" : "4" 
}] 
uids = map(lambda x:x["uid"], users) 

Si la abreviatura subrayado está en algún lugar en Python, esto sería posible:

uids = pluck(users, "uid") 

por supuesto es trivial para añadir, pero es que en algún lugar del pitón ya?

+1

Respuesta corta: no – katrielalex

Respuesta

36

sólo tiene que utilizar una lista de comprensión cualquier función está consumiendo uids:

en lugar de

uids = map(operator.itemgetter("uid"), users) 
foo(uids) 

hacer

foo([x["uid"] for x in users]) 

Si lo que desea es uids para repetir, usted don' t necesidad de hacer una lista - usar un generador en su lugar. (Reemplazar [] con ().)


Por ejemplo:

def print_all(it): 
    """ Trivial function.""" 
    for i in it: 
     print i 

print_all(x["uid"] for x in users) 
+2

Se podría usar 'x.get ('uid', Ninguno)' (donde 'None' es el valor predeterminado) para evitar que se haga una excepción cuando el elemento no tiene un uid. –

12

De funcy módulo (https://github.com/Suor/funcy) se puede recoger despluma función.

En este caso, siempre que funcy está disponible en el host, el siguiente código debería funcionar como se esperaba: la atención

from funcy import pluck 

users = [{ 
    "name" : "Bemmu", 
    "uid" : "297200003" 
}, 
{ 
    "name" : "Zuck", 
    "uid" : "4" 
}] 

uids = pluck("uid", users) 

pago al hecho de que el orden de los argumentos es diferente de la utilizada con subrayado. js