我有一个如下所示的列表:
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
我想生成一个如下所示的过滤列表:
filtered_lst = [2, 6, 7, 9, 10, 13]
Python是否提供自定义切片的约定。例如:
lst[1, 5, 6, 8, 9, 12] # slice a list by index
答案 0 :(得分:16)
from operator import itemgetter
itemgetter(1, 5, 6, 8, 9, 12)(lst)
演示:
>>> from operator import itemgetter
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
>>> itemgetter(1, 5, 6, 8, 9, 12)(lst)
(2, 6, 7, 9, 10, 13)
这会返回一个元组;如果需要,则转换为list(itemgetter(...)(lst))
的列表。
请注意,这相当于带有一组索引而不是范围的切片表达式(lst[start:stop]
);它不能用作左侧切片分配(lst[start:stop] = some_iterable
)。
答案 1 :(得分:5)
Numpy数组有这种切片语法:
In [45]: import numpy as np
In [46]: lst = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])
In [47]: lst[[1, 5, 6, 8, 9, 12]]
Out[47]: array([ 2, 6, 7, 9, 10, 13])
答案 2 :(得分:1)
我会选择Martijn Pieters建议的operator.itemgetter()
方法,但这是另一种方式(完整性)
In [23]: lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
In [24]: indices = set([1, 5, 6, 8, 9, 12])
In [25]: [n for i,n in enumerate(lst) if i in indices]
Out[25]: [2, 6, 7, 9, 10, 13]
答案 3 :(得分:1)
使用列表理解可以轻松直接地完成。
lst = range(1, 14)
indices = [1, 5, 6, 8, 9, 12]
filtered_lst = [lst[i] for i in indices]
答案 4 :(得分:0)
Python切片允许您将切片作为赋值的目标。并且Python切片语法不允许具有不规则索引模式的切片。因此,如果您希望将“自定义”切片作为赋值的目标,那么使用Python切片语法是不可能的。
如果通过获取指定元素的副本来满足您的要求,则operator.itemgetter()
符合您的需求。如果你需要切片赋值,那么numpy切片是一个不错的选择。