2013-03-07 5 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 является эффективным способом сделать это, но я не знаком с этой функцией, и у меня, похоже, возникают проблемы с написанием лямбда-функции для описания непрерывного характера.

Вопрос: Есть ли лучший способ делать это (возможно с 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

+0

@DSM Он используется, чтобы быть рецептом в документации 'itertools', но, похоже, больше не может найти его там ... –

+0

+1: что @DSM сказал. [Вот ссылка на пример подряд подряд в документах] (http://docs.python.org/2.6/library/itertools.html#examples) – jfs

Смежные вопросы