说我有一个列表:
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:]
我可以很容易地编写一个执行此操作的函数,但是我想知道是否可以在一个表达式中执行此操作。
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]
slice
>>> 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]]
但是最好将它们保留在列表列表中。
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)
用>>> L1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
填充索引:
None
现在理解:
>>> indices = (None, 2, 5, 7, None)