2013-03-07 31 views
4

我有一個整數列表,我想生成一個包含所有連續整數列表的列表。python返回列表中的連續整數

#I have: 
full_list = [0,1,2,3,10,11,12,59] 
#I want: 
continuous_integers = [[0,1,2,3], [10,11,12], [59]] 

我有工作,但似乎是一個好辦法如下做到這一點:

sub_list = [] 
continuous_list = [] 
for x in full_list: 
    if sub_list == []: 
     sub_list.append(x) 
    elif x-1 in sub_list: 
     sub_list.append(x) 
    else: 
     continuous_list.append(sub_list) 
     sub_list = [x] 
continuous_list.append(sub_list) 

我見過的其他問題表明itertools.groupby是做到這一點的有效途徑,但是我對這個函數並不熟悉,而且我似乎在編寫lambda函數來描述連續性時遇到了麻煩。

問:有沒有更好的方式來這樣做(可能與itertools.groupby?)

注意事項:full_list將有整數1和59之間,會一直進行排序,並整數將爲0之間59.

回答

9

您可以使用下面的方法:

from operator import itemgetter 
from itertools import groupby 
full_list = [0,1,2,3,10,11,12,59] 
cont = [map(itemgetter(1), g) for k, g in groupby(enumerate(full_list), lambda (i,x):i-x)] 
# [[0, 1, 2, 3], [10, 11, 12], [59]] 
+2

通常當我說什麼是聰明的,我的意思是它作爲一個批評:「聰明」我的意思是「依賴的非明顯的特徵問題以微妙的方式不健全或通常有用「。然而,這是一個很好的方法。 – DSM 2013-03-07 16:26:39

+0

@DSM它在'itertools'文檔中用作配方 - 但似乎無法再找到它了... – 2013-03-07 17:02:33

+0

+1:什麼@DSM說。 [這裏是文檔中連續運行示例的鏈接](http://docs.python.org/2.6/library/itertools.html#examples) – jfs 2013-03-07 18:51:37