2013-03-07 6 views
4

나는 정수의 목록을 가지고 있고, 모든 연속 정수의 목록을 포함하는 목록을 생성하고 싶습니다. 나는 다른 질문 itertools.groupby이 작업을 수행 할 수있는 효율적인 방법이라고 제안 보았다파이썬 목록에서 연속 정수의 목록을 반환

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) 

:

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

나는 그것을 할 빈약 한 방법처럼 작동하지만 보인다 다음이 그러나 나는 그 기능에 익숙하지 않고 나는 연속적인 성질을 기술하기 위해 람다 함수를 작성하는 데 어려움을 겪고있는 것처럼 보인다.

질문 :이 일을 할 수있는 더 좋은 방법은 (? 아마도 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