繁体   English   中英

python中的复杂列表切片/索引

[英]Complex list slice/index in python

我有一个如下所示的列表:

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

使用operator.itemgetter()

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 )。

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])

我会选择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]

使用列表理解可以轻松直接地完成。

lst = range(1, 14)
indices = [1, 5, 6, 8, 9, 12]
filtered_lst = [lst[i] for i in indices]

Python切片允许您将切片作为赋值的目标。 并且Python切片语法不允许具有不规则索引模式的切片。 因此,如果您希望将“自定义”切片作为赋值的目标,那么使用Python切片语法是不可能的。

如果通过获取指定元素的副本来满足您的要求,则operator.itemgetter()满足您的需求。 如果你需要切片分配,那么numpy切片是一个不错的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM