如何同时执行多个列表切片?

问题描述 投票:2回答:5

说我有一个列表:

L1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]

并且我有一个索引列表:

indices = (2, 5, 7)

我想做的是同时对所有3个索引切片列表。换句话说,id喜欢在一行中执行以下代码行:

sub1 = L1[:2]
sub2 = L1[2:5]
sub3 = L1[5:7]
sub4 = L1[7:]

我可以很容易地编写一个执行此操作的函数,但是我想知道是否可以在一个表达式中执行此操作。

python slice
5个回答
4
投票
L1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] indices = (2, 5, 7) start = 0 sections = [] for end in indices: sections.append(L1[start:end]) start = end sections.append(L1[start:]) for part in sections: print part # [1, 2] # [3, 4, 5] # [6, 7] # [8, 9]

4
投票
slice

2
投票
>>> from operator import itemgetter >>> get = itemgetter(slice(0, 2), slice(2, 5), slice(5, 7), slice(7, None)) >>> values = range(1, 10) >>> values [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> get(values) ([1, 2], [3, 4, 5], [6, 7], [8, 9])

输出

seq = [1, 2, 3, 4, 5, 6, 7, 8, 9] ind = (2, 5, 7) print([seq[p:q] for p,q in zip((0,)+ind, ind+(len(seq),))])

如果您真的想将子列表分配给单独的名称,则可以这样操作:

[[1, 2], [3, 4, 5], [6, 7], [8, 9]]

但是最好将它们保留在列表列表中。


0
投票
下面的代码将slice列表的一端扩展为0,另一端扩展为endpoints,并使用None组合成对。然后使用zip()技巧提取切片:

operator.itemgetter()

输出:

import operator
ends = [2,5,7]
values = range(20)

operator.itemgetter(*[slice(*z) for z in zip([0]+ends, ends+[None])])(values)

0
投票
从列表开始:

List comprehensions

>>> L1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 填充索引:

None

现在理解:

>>> indices = (None, 2, 5, 7, None)
© www.soinside.com 2019 - 2024. All rights reserved.