2011-03-25 15 views
39

Harita() kullanarak bir liste işlenirken, lambda içinde iken öğenin dizinine erişmek istiyorum. Bunu nasıl yapabilirim? ÖrneğinHarita kullanarak bir liste işlenirken öğenin indekslenmesi python

ranked_users = ['jon','bob','jane','alice','chris'] 
user_details = map(lambda x: {'name':x, 'rank':?}, ranked_users) 

nasıl yukarıdaki örnekte her kullanıcının rütbe alabilirim?

cevap

54

Kullanım 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. Benim ilk cevap şiddetle mümkün olduğunca map ve lambda üzerinde liste anlama veya jeneratör ifadesini kullanarak öneriyoruz

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

oldu. Anlamaların listesi daha okunabilir ve önyükleme için daha hızlı olma eğilimindedir.

+0

Lambda'nın parametreleri parantez içinde olmamalıdır mu? – dheerosaur

+1

@dheerosaur Bu durumda, numaralandırmadaki sonraki() işlem bir tuple döndürdüğü için olmaz. Bu lambda hataya eşdeğerdir ((i, x)) – Rod

+0

@dheerosaur: Aslında parantez zorunludur. “numaralandırma” tuples (tek bir nesne) üretir. – unutbu

4

Alternatif olarak map() ve lambda yerine list comprehension kullanabilirsiniz.

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

Çıktı:

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

Liste comprehensions çok güçlü ve map ve lambda bir kombinasyonu daha da faster bulunmaktadır.

+4

'list.index()', yalnızca "ranking_users" öğesinin üyeleri benzersiz olduğunda uygundur. Verilen 'ranking_users = [' chris ',' chris '] 'user_details' çıktıları [{' name ':' chris ',' rank ': 0}, {' name ':' chris ',' rank ': 0 }} 'olması gereken yer [{'name': 'chris', 'rank': 0}, {'name': 'chris', 'rank': 1}]'. – thisgeek

+0

Sadece üyeler için benzersiz olmasına rağmen (bu veriler göz önüne alındığında)… – Prydie

+0

Elbette. Cevabınız örneğe uyuyor. Sadece bu yazıya rastlayan herkesin benzersizliğini bildirmenin iyi bir fikir olacağını düşündüm. – thisgeek

İlgili konular