Получение индекса элемента при обработке списка с использованием карты в python
При обработке списка с использованием map() я хочу получить доступ к индексу элемента во время лямбда. Как я могу это сделать?
Например
ranked_users = ['jon','bob','jane','alice','chris']
user_details = map(lambda x: {'name':x, 'rank':?}, ranked_users)
Как я могу получить ранг каждого пользователя в приведенном выше примере?
Ответы
Ответ 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
.