如何以不规则的间隔切片列表?

时间:2018-09-05 02:54:52

标签: python numpy

我想对以下列表进行切片,以使最终结果为[1,1.5,2,2.5,4.5,5]。我尝试按索引访问,但这给了我错误。

`list = [1,1.5,2,2.5,3,3.5,4,4.5,5]
print(list)
print(list[0,1,2,3,7,8])`

3 个答案:

答案 0 :(得分:2)

您不能使用索引列表来对列表进行切片或索引。您必须使用循环,例如通过comprehension或其中包含隐式循环的函数,例如itemgetter返回的循环:

>>> lst = [1,1.5,2,2.5,3,3.5,4,4.5,5]
>>> print([lst[i] for i in [0, 1, 2, 3, 7, 8]])
[1, 1.5, 2, 2.5, 4.5, 5]
>>> print(operator.itemgetter(0, 1, 2, 3, 7, 8)(lst))
[1, 1.5, 2, 2.5, 4.5, 5]

但是您可以用numpy数组做类似的事情。您不能直接使用六个索引(因为这意味着多维索引),但是您可以 使用包含这六个索引的任何类似数组的形式(例如列表):

>>> arr = np.array(lst)
>>> print(arr[[0, 1, 2, 3, 7, 8]])
[1.  1.5 2.  2.5 4.5 5. ]

在基本索引指南的Index arrays中对此进行了解释。

答案 1 :(得分:0)

Python不支持不规则间隔。您必须使用列表理解。

lst = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
indices = (0, 1, 2, 3, 7, 8)
slice = [lst[i] for i in indices]

print(slice) # [1, 1.5, 2, 2.5, 4.5, 5]

此外,请勿使用诸如list之类的名称作为变量,因为这会掩盖内置函数。

答案 2 :(得分:0)

以另一种方式工作;而不是选择非连续范围,请删除您不需要所需的连续范围。您只想获取原始的list减去索引4-6(含4-6),因此复制您的list,然后复制del不需要的索引:

mylist = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
trimmed = mylist[:]
del trimmed[4:7]
print(trimmed)

或者,您可以使用operator.itemgetter来检索列出的特定索引,例如:

from operator import itemgetter

mylist = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
print(itemgetter(0, 1, 2, 3, 7, 8)(mylist))

itemgetter(包含多个值)将输出tuple,因此,如果您对此感到烦恼,则必须转换回list,例如print(list(itemgetter(0, 1, 2, 3, 7, 8)(mylist)))(请注意,选择将变量名更改为mylist使得可以访问list构造函数,而如果您将变量命名为list则是不可能的。 )。