2011-03-25 14 views

Respuesta

54

Uso enumerate:

In [3]: user_details = [{'name':x, 'rank':i} for i,x in enumerate(ranked_users)] 

In [4]: user_details 
Out[4]: 
[{'name': 'jon', 'rank': 0}, 
{'name': 'bob', 'rank': 1}, 
{'name': 'jane', 'rank': 2}, 
{'name': 'alice', 'rank': 3}, 
{'name': 'chris', 'rank': 4}] 

PS. Mi primera respuesta fue

user_details = map(lambda (i,x): {'name':x, 'rank':i}, enumerate(ranked_users)) 

Me gustaría recomendar encarecidamente el uso de una lista por comprensión o expresión generadora sobre map y lambda siempre que sea posible. Las listas de comprensión son más legibles y tienden a ser más rápidas para arrancar.

+0

¿No deberían los parámetros de lambda estar sin paréntesis? – dheerosaur

+1

@dheerosaur No en este caso, ya que la operación next() en enumerate devuelve una tupla. Esta lambda es equivalente a def foo ((i, x)) – Rod

+0

@dheerosaur: En realidad, los paréntesis son obligatorios. 'enumerate' genera tuplas (un solo objeto). – unutbu

4

Alternativamente, podría usar un list comprehension en lugar de un mapa() y lambda.

ranked_users = ['jon','bob','jane','alice','chris'] 
user_details = [{'name' : x, 'rank' : ranked_users.index(x)} for x in ranked_users] 

Salida:

[{'name': 'jon', 'rank': 0}, {'name': 'bob', 'rank': 1}, {'name': 'jane', 'rank': 2}, {'name': 'alice', 'rank': 3}, {'name': 'chris', 'rank': 4}] 

listas por comprensión son muy potentes y son también faster que una combinación de map y lambda.

+4

'list.index()' solo es apropiado si todos los miembros de 'ranked_users' son únicos. Dado '' rank_users = ['chris', 'chris'] '' user_details' produce '[{'nombre': 'chris', 'rank': 0}, {'nombre': 'chris', 'rank': 0 }] 'donde debería ser' [{'nombre': 'chris', 'rank': 0}, {'nombre': 'chris', 'rank': 1}] '. – thisgeek

+0

Tendría sentido (dada esta información) que los miembros sean únicos aunque ... – Prydie

+0

Claro. Tu respuesta se ajusta al ejemplo. Solo pensé que sería una buena idea declarar la advertencia de exclusividad para cualquiera que se encuentre con esta publicación. – thisgeek

Cuestiones relacionadas