我想知道一种有效的优雅方法来基于索引切片python列表。为了提供一个最小的示例:
temp = ['a','b','c','d']
index_needed=[0,2]
如何在没有循环的情况下对列表进行切片?
预期产量
output_list =['a','c']
我觉得有办法,但还没有想出办法。有什么建议吗?
答案 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:
您可以在其中解压缩所有值,然后将不需要的值发送到_
,以表示缺乏兴趣,也可以使用itemgetter
和map
剥离它们拆解之前,请先检查您要关心的内容:
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
的方法并不在乎您是否有四个以上的项目,而手动拆包总是需要恰好四个。哪个更好,很大程度上取决于您的用例。