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

mad*_*ad_ 3 python arrays numpy list python-2.7

我想知道基于索引切片 python 列表的有效且优雅的方法是什么。为了提供一个最小的例子:

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

index_needed=[0,2]
Run Code Online (Sandbox Code Playgroud)

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

预期产出

output_list =['a','c']
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,会有办法,但还没有找到。有什么建议么?

jpp*_*jpp 6

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

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

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

res = [temp[i] for i in idx]            # ['a', 'c']
Run Code Online (Sandbox Code Playgroud)

使用内置插件,您可能会发现map性能更好:

res = map(temp.__getitem__, idx)        # ['a', 'c']
Run Code Online (Sandbox Code Playgroud)

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


如果您希望完全避免 Python 级循环,您可能希望使用第 3 方库,例如 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')
Run Code Online (Sandbox Code Playgroud)

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