2013-03-07 129 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