2015-11-13 78 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]]