2016-02-25 16 views
1

這是一個python 101問題,但我想不出一個pythonic方法來枚舉斷點列表,以便在這些斷點之間的所有整數。完全枚舉斷點列表的範圍

說我有:

breaks = [4, 7, 13, 15, 18] 

,我想

enumerated = [[4,5,6],[7,8,9,10,11,12],[13,14],[15,16,17],[18]] 

(我的實際使用情況涉及那些年斷點,我希望所有年,在每範圍內)。 我可以通過breaks與計數器循環,爲每個區間創建一個range並將其存儲在一個列表中,但我懷疑這種枚舉有一個簡單的單行程序。自從我處理數百萬條記錄以來,效率就成了一個問題。

回答

4

您可以使用壓縮

>>> enumerated = [range(start, end) for start,end in zip(breaks, breaks[1:])] + [[breaks[-1]]] 
>>> enumerated 
[[4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14], [15, 16, 17], [18]] 

在一個(zip(breaks, breaks[1:])偏移量是已知的「絕招」讓所有對使用自身列表的壓縮和解。這將刪除最後一個,所以我手動添加它。

1

您可以創建一個發電機,這將是存儲效率:

def f(b): 
    if not b: 
     raise StopIteration 
    x = b[0] 
    for y in b[1:]: 
     yield xrange(x, y) 
     x = y 
    yield [y] 

print list(f(breaks)) 
0

您可以使用一個簡單的列表理解和range()

breaks = [4, 7, 13, 15, 18] 
new = [range(breaks[i],breaks[i+1]) for i in xrange(len(breaks)-1)]+[[breaks[-1]]] 
print new 

[[4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14], [15, 16, 17]]