使用map()處理列表時,我想在lambda內訪問項目的索引。我怎樣才能做到這一點?使用python處理列表時處理列表的項目索引
例如
ranked_users = ['jon','bob','jane','alice','chris']
user_details = map(lambda x: {'name':x, 'rank':?}, ranked_users)
我怎樣才能獲得在上述例子中,每個用戶的等級?
使用map()處理列表時,我想在lambda內訪問項目的索引。我怎樣才能做到這一點?使用python處理列表時處理列表的項目索引
例如
ranked_users = ['jon','bob','jane','alice','chris']
user_details = map(lambda x: {'name':x, 'rank':?}, ranked_users)
我怎樣才能獲得在上述例子中,每個用戶的等級?
使用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))
我強烈建議使用列表理解或發電機表達了map
和lambda
只要有可能。列表理解更具可讀性,並且啓動速度更快。
或者,您可以使用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}]
列表內涵是非常強大的,也是faster比map
和lambda
的組合。
'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
它只有有意義(給出這個數據)的成員是唯一的,但... – Prydie 2012-11-29 11:39:28
當然。你的回答適合這個例子。我只是認爲這是一個好主意,對任何遇到這篇文章的人說明唯一性警告。 – thisgeek 2012-11-29 18:27:08
lambda的參數不應該沒有括號嗎? – dheerosaur 2011-03-25 13:16:01
@dheerosaur不在這種情況下,因爲enumerate上的next()操作返回一個元組。這個lambda相當於def foo((i,x)) – Rod 2011-03-25 13:20:40
@dheerosaur:實際上,括號是強制性的。 '枚舉'生成元組(一個對象)。 – unutbu 2011-03-25 13:21:48