基于索引的python列表中的优雅切片

时间:2018-08-23 14:26:51

标签: python arrays python-2.7 list numpy

我想知道一种有效的优雅方法来基于索引切片python列表。为了提供一个最小的示例:

temp = ['a','b','c','d']

index_needed=[0,2]

如何在没有循环的情况下对列表进行切片?

预期产量

output_list =['a','c']

我觉得有办法,但还没有想出办法。有什么建议吗?

3 个答案:

答案 0 :(得分:4)

首先,请注意,Python中的索引从0开始。因此,您需要的索引将是[0, 2]

然后您可以使用列表理解:

temp = ['a', 'b', 'c', 'd']
idx = [0, 2]

res = [temp[i] for i in idx]            # ['a', 'c']

使用内置功能,您可能会发现map的效果更好:

res = map(temp.__getitem__, idx)        # ['a', 'c']

由于您使用的是Python 2.7,因此将返回一个列表。对于Python 3.x,您需要将map对象传递给list


如果您希望完全避免使用Python级别的循环,则不妨使用NumPy之类的第三方库:

import numpy as np

temp = np.array(['a', 'b', 'c', 'd'])
res = temp[idx]

# array(['a', 'c'], 
#       dtype='<U1')

res2 = np.delete(temp, idx)

# array(['b', 'd'], 
#       dtype='<U1')

这将返回一个NumPy数组,然后您可以通过res.tolist()将其转换为列表。

答案 1 :(得分:1)

使用此:

temp = ['a','b','c','d']

temp[0:4:2]

#Output
['a', 'c']

第一个值是开始索引号(包含),第二个值是结束索引号(已排除),第三个值是要执行的步骤。

学习愉快...:)

答案 2 :(得分:0)

将工作推送到CPython(参考解释器)上的C层的替代方法:

from operator import itemgetter

temp = ['a','b','c','d']

index_needed=[0,2]

output_list = itemgetter(*index_needed)(temp)

返回值tuple;如果需要list,只需将其包装在list构造函数中:

output_list = list(itemgetter(*index_needed)(temp))

请注意,仅当您需要至少两个索引时,此方法才能正常工作; itemgetter是基于变量初始化方式的变量返回类型,在传递单个键进行拉取时直接返回该值,而在传递多个键时则返回一个tuple值。

一次性使用也不是特别有效。一个更常见的用例是,如果您有一个可迭代的序列(通常为tuple,但是任何序列都可以使用),而不关心它们。例如,输入list为:

allvalues = [(1, 2, 3, 4),
             (5, 6, 7, 8)]

如果只需要索引1和3中的值,则可以编写如下循环:

for _, x, _, y in allvalues:

您可以在其中解压缩所有值,然后将不需要的值发送到_,以表示缺乏兴趣,也可以使用itemgettermap剥离它们拆解之前,请先检查您要关心的内容:

from future_builtins import map  # Because Py2's map is terrible; not needed on Py3

for x, y in map(itemgetter(1, 3), allvalues):

itemgetter的给定元素中,基于allvalues的方法并不在乎您是否有四个以上的项目,而手动拆包总是需要恰好四个。哪个更好,很大程度上取决于您的用例。