基于索引列表返回子列表的最简单,最有效的功能是什么?

时间:2012-09-17 18:50:56

标签: python list

说我有一个列表l

['a','b','c','d','e']

和索引列表idx

[1,3]

将返回的最简单,最有效的功能是什么:

['b','d']

3 个答案:

答案 0 :(得分:13)

尝试使用:

[l[i] for i in idx]

答案 1 :(得分:7)

您想要operator.itemgetter

在我的第一个示例中,我将展示如何使用itemgetter构造可在任何可索引对象上使用的可调用对象:

from operator import itemgetter
items = itemgetter(1,3)
items(yourlist)  #('b', 'd')

现在我将展示如何使用参数解包将索引存储为列表

from operator import itemgetter
a = ['a','b','c','d','e']
idx = [1,3]
items = itemgetter(*idx)
print items(a)  #('b', 'd')

当然,这会给你一个tuple,而不是list,但是如果你真的需要的话,从元组构造一个列表是微不足道的。

答案 2 :(得分:-1)

这是一个使用列表理解的选项:

[v for i, v in enumerate(l) if i in idx]

如果您先将idx转换为集合,这将更有效。

operator.itemgetter的替代方案:

import operator
operator.itemgetter(*idx)(l)

正如评论中所述,[l[i] for i in idx]可能是您最好的选择,除非idx可能包含大于l长度的索引,或idx不是l已订购,您希望保持与{{1}}相同的订单。