使用python中的map处理列表时获取项目的索引

时间:2011-03-25 13:02:47

标签: python

使用map()处理列表时,我希望在lambda内部访问项目的索引。我怎么能这样做?

例如

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

如何在上面的示例中获得每个用户的排名?

4 个答案:

答案 0 :(得分:73)

使用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上使用列表推导或生成器表达式。列表推导更具可读性,并且启动速度更快。

答案 1 :(得分:6)

或者你可以使用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而不是maplambda的组合。

答案 2 :(得分:1)

实际上,与在地图中使用枚举元组相比,这是一个更优雅,更冗长的解决方案(由于元组索引)。 Map可以将更多的Iterables作为参数,所以让我们使用它。

map(lambda user, user_id: (user_id, user), ranked_users, range(ranked_users.__len__()))

答案 3 :(得分:0)

我认为问题是关于映射函数的,并且由于将元组参数放在lambda lambda (i,x)上而导致的语法错误,因此首选答案部分正确。

枚举的想法很好,正确的解决方案是:

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倍