2013-04-21 2 views
0

안녕하세요 신사 숙녀 신사의 차이, 나는 목록에 연속 번호를 찾기 위해이 코드 조각이찾기 델타 - 파이썬 목록의 요소

:

from itertools import groupby 
from operator import itemgetter 

a = [1,2,3,5,55,56] 

def consc(b): 
    for k, g in groupby(enumerate(b), lambda (i,x):i-x): 
    print map(itemgetter(1), g) 

consc(a) 

출력 :

[1, 2, 3] 
[5] 
[55, 56] 

그러나 다른 델타도 찾을 수 있기를 원합니다. (1 ~ 10) 예를 들어 2의 차이는 같은 목록에서 다음 출력을 산출합니다.

[1] 
[2] 
[3,5] 
[55] 
[56] 

고마워요!

답변

2

그것은 실제로 매우 간단 수정의 :

from itertools import groupby, count 
from operator import itemgetter 

a = [1,2,3,5,55,56] 

def consc(b, step): 
    for k, g in groupby(zip(count(step=step), b), lambda (i, x): i-x): 
    print map(itemgetter(1), g) 

consc(a, 2) 

제공 :

[1] 
[2] 
[3, 5] 
[55] 
[56] 

을 대신 enumerate()를 사용하여, 우리는 원하는 수 있습니다 원하는 값의 단계로 zip()count() 사용 결과.

조금 정리 :

from itertools import groupby, count 
from operator import itemgetter 

def _sub(item): 
    a, b = item 
    return a - b 

def consecutive(iterable, step): 
    for _, g in groupby(zip(count(step=step), iterable), _sub): 
     yield map(itemgetter(1), g) 

a = [1, 2, 3, 5, 55, 56] 

print(list(consecutive(a, 2))) 

이 여기에 발전기를 가지고 있고, 더 자세한 설명 이름을 사용하는 의미가 있습니다. 실제 함수를 사용하면 lambda처럼 함수를 사용할 때마다 다시 선언 할 필요가 없습니다. 이것은 파이썬 3.x에서도 언어에서 제거 된 인수 압축 풀기를 사용하지 않아도 작동합니다.

+0

나는 'i-x'를'i * step-x'로 대체하려고 생각했던 것보다 더 좋아합니다. – DSM

+0

대단히 감사합니다! 매력처럼 작동합니다 ;-) – eladc