Подтвердить что ты не робот

Получение индекса элемента при обработке списка с использованием карты в python

При обработке списка с использованием map() я хочу получить доступ к индексу элемента во время лямбда. Как я могу это сделать?

Например

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

Как я могу получить ранг каждого пользователя в приведенном выше примере?

4b9b3361

Ответ 1

Используйте 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, когда это возможно. Перечисления списков более читабельны и, как правило, быстрее загружаются.

Ответ 2

В качестве альтернативы вы можете использовать список, а не 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}]

Перечисления списков очень мощные и быстрее, чем комбинация map и lambda.