2015-11-13 74 views
1

执行多个列表切片说我有一个列表:如何在同一时间在Python

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

我可以相当容易地编写像这样的功能,但我想知道是否有可能做到这一点的一个表达。

+0

你希望每个片是在一个不同的变量?如果是这样,切片的数量总是相同的? –

+0

我正在寻找一个通用的案例,所以任何数量的指数假设它适合列表的长度。 – Malonge

+0

theres没有好的方法来设置每个新的变量,如果你想它是一个普通的情况,但它可以设置一个键值对像一个字典像'd = {'sub1':l1 [:2],' sub2':L1 [2:5] ...}'那么你可以用'd ['sub1']'等得到每个片段。或只是一个字符串列表 –

回答

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] 
+0

是的,我会做这样的事情,但我想知道是否有这种场合预先建立的工具。 – Malonge

+1

我对此表示怀疑。你在这里使用两个单独的概念:数组切片和迭代。 Python编写一个将这些东西打包在一起的函数没有什么意义。你最好自己写一个函数。 –

3

你可以使用operator.itemgetterslice对象:

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

是的,它可以在一个表达式完成,但它不是很可读:

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


如果你真的想分配子列表用以分隔名字,你可以做这样的:

s1, s2, s3, s4 = [seq[p:q] for p,q in zip((0,)+ind, ind+(len(seq),))] 

,但它可能会更好,只是让他们在列出的清单。

0

那么,借助一些内置功能,您可以在一行中完成。 '最大'的问题是将终点列表转换为一个(start,end)元组或slice对象的列表。

下面的代码扩展endpoints列表,其中一端为0,另一端为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, 1], [2, 3, 4], [5, 6], [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) 
0

List comprehensions是惊人的。

开始与您的清单:

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

垫的指数与None

>>> indices = (None, 2, 5, 7, None) 

现在领悟远:

>>> [L1[start:stop] for start, stop in zip(indices[:-1], indices[1:])] 
[[1, 2], [3, 4, 5], [6, 7], [8, 9]]