2011-03-25 40 views
39

使用map()處理列表時,我想在lambda內訪問項目的索引。我怎樣才能做到這一點?使用python處理列表時處理列表的項目索引

例如

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

我怎樣才能獲得在上述例子中,每個用戶的等級?

回答

54

使用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。我的第一個答案是

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

我強烈建議使用列表理解或發電機表達了maplambda只要有可能。列表理解更具可讀性,並且啓動速度更快。

+0

lambda的參數不應該沒有括號嗎? – dheerosaur 2011-03-25 13:16:01

+1

@dheerosaur不在這種情況下,因爲enumerate上的next()操作返回一個元組。這個lambda相當於def foo((i,x)) – Rod 2011-03-25 13:20:40

+0

@dheerosaur:實際上,括號是強制性的。 '枚舉'生成元組(一個對象)。 – unutbu 2011-03-25 13:21:48

4

或者,您可以使用list comprehension而不是map()和lambda。

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

輸出:

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

列表內涵是非常強大的,也是fastermaplambda的組合。

+4

'list.index()'只適用於'ranking_users'的所有成員都是唯一的。給定'ranking_users = ['chris','chris']'user_details'輸出'[{'name':'chris','rank':0},{'name':'chris','rank':0 }]'應該是'[{'name':'chris','rank':0},{'name':'chris','rank':1}]'。 – thisgeek 2012-11-25 15:51:52

+0

它只有有意義(給出這個數據)的成員是唯一的,但... – Prydie 2012-11-29 11:39:28

+0

當然。你的回答適合這個例子。我只是認爲這是一個好主意,對任何遇到這篇文章的人說明唯一性警告。 – thisgeek 2012-11-29 18:27:08