2014-06-20 58 views
0

嘿,我試圖生成列表的子列表。比如我有一個列表如下:
l = [1,2,3,4,5,6,7,8,9,10,11,12]python生成具有偏移量和條件的子列表

我想他們在與子列表4.長度,但到第一個元素拆分就像是從前面的列表中最後一個元素相同,就像我說的這必須有4的長度。像這樣:

l1 = [1,2,3,4] 
l2 = [4,5,6,7] 
l3 = [7,8,9,10] 
l4 = [10, 11, 12] <-- should be ignored 

有人有一個想法?!我正在考慮發電機,但我不太確定。

+3

你肯定已經試過的東西。展示下! –

回答

3

一個簡單而靈活的發電機實施:

def overlapping_sublists(l, n, overlap=1, start=0):   
    while start <= len(l) - n: 
     yield l[start:start+n] 
     start += n - overlap 

用法示例:

>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 
>>> list(overlapping_sublists(l, 4)) 
[[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]] 
>>> list(overlapping_sublists(l, 4, 2, 3)) 
[[4, 5, 6, 7], [6, 7, 8, 9], [8, 9, 10, 11]] 
3
print([l[i:i+4] for i in range(0, len(l), 3)]) 

輸出:

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

只有長度爲4的子列表:

​​

輸出:

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

使用生成器:

for n in (m for m in (l[i:i+4] for i in range(0, len(l), 3)) if len(m) == 4): 
    print(n) 

輸出:

[1, 2, 3, 4] 
[4, 5, 6, 7] 
[7, 8, 9, 10] 
4
a = [] 
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 
for i in range(0, len(l)-3, 3): 
    a.append(l[i:i+4]) 

會給a = [[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]

,也可以作爲一個列表理解使用:

[l[i:i+4] for i in range(0, len(l)-3, 3)] 
+1

這是一個列表理解,而不是一個生成器。 –

+0

@tobias_k將[''改成'('使它成爲一個生成器表達式。 –

+0

@tobias_k,歡呼聲,我永遠不會以正確的方式得到名字 – Holloway

相關問題