从列表中返回连续整数的列表 - Python

5
我有一个整数列表,我想生成包含所有连续整数的列表。
#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之间。

1个回答

10

您可以使用以下食谱:

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
@DSM,以前在itertools文档中有一个配方,但现在似乎找不到了... - Jon Clements
+1:就像 @DSM 所说的那样。这里是文档中连续运行示例的链接 - jfs
@J.F.Sebastian,感谢您发布链接 - 我知道我没有想象中的那么糟糕 ;) - Jon Clements

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接