在Python中使用map处理列表时获取项目索引

106 投票
4 回答
135143 浏览
提问于 2025-04-16 14:25

在使用map()处理一个列表的时候,我想在lambda函数里面访问到当前项的索引。该怎么做呢?

比如说:

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

我怎样才能在上面的例子中获取每个用户的排名呢?

4 个回答

12

在我看来,这个问题是关于map函数的,而我认为比较好的答案部分正确,因为在lambda表达式中把元组作为参数放进去会导致语法错误,像这样 lambda (i,x)

使用enumerate这个想法很好,正确的解决方案应该是:

map(lambda x: {'name':x[1], 'rank':x[0]}, enumerate(ranked_users))

还有一些时间测试,用来比较速度和列表推导式的表现:

def with_map():
    ranked_users = range(10 ** 6)
    list(map(lambda x: {'name': x[1], 'rank': x[0]}, enumerate(ranked_users)))

def by_comprehension():
    ranked_users = range(10 ** 6)
    [{'name': x, 'rank': i} for i, x in enumerate(ranked_users)]

from timeit import timeit
time_with_map = timeit(with_map, number=10)
time_with_comprehension = timeit(by_comprehension, number=10)

print('list comprehension is about %.2f x faster than map in this test case' % (time_with_map/time_with_comprehension))

测试结果显示:在这个测试案例中,列表推导式的速度大约是map的1.31倍快。

13

另外,你可以使用列表推导式,而不是用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}]

列表推导式非常强大,而且比用maplambda组合起来的方式要

144

使用 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}]

附注:我之前的回答是

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

我强烈建议在可能的情况下,使用列表推导式或生成器表达式,而不是 maplambda。因为列表推导式更容易理解,而且通常运行得更快。

撰写回答