2016-08-03 5 views
1

난수가 포함 된 목록이 있습니다. 이 목록을 반복하고 싶습니다. 숫자와 연속 번호가 하나의 숫자 단계 안에 있으면 하위 목록으로 연결하고 싶습니다. 예를 들어파이썬 목록에서 인접한 숫자를 병합하십시오.

:

input = [1,2,4,6,7,8,10,11] 
output = [[1,2],[4],[6,7,8],[10,11]] 

입력 목록은 항상 증가하는 순서로 정렬 긍정적 인 int 치의 포함됩니다. here에서 일부 코드를 시도했습니다. 나는 목록에서 매 2 개 항목을 CONCAT 수 있지만

initerator = iter(inputList) 
outputList = [c + next(initerator, "") for c in initerator] 

, 나는 지능형리스트에서 적절한 if를 추가 할 수없는 것.

파이썬 버전 =은 "분할"인덱스와 다음 슬라이스 발견 3.4

+3

한 줄짜리 : itertools.groupby (enumerate (inputList), lambda x : x [1] - x [0])]]의 _ [grp]에 대한 [[x의 경우 x, grp의 경우]. –

+0

고마워,이게 좋아 보인다 ...... 그리고 나는 일을 잘 이해하고있다 ....... 그렇지만 내가 각 엔트리에 글자를 붙이면 입력 = [a1, a2, a4, b6 , [c7, c8, c10, d11]에서 문자로 그룹화하고 [a1, a2], [a4], [b6], [c7, c8], [c10], [d11] ... 나는 "groupby"와 "enumerate"방법을 완전히 이해하지 못하는데, 아마도이 방법을 사용할 수없는 이유 일 것입니다 ... 다시 한 번 감사드립니다. – Eoin

답변

0

좋은 방법 (:.

input = [1,2,4,6,7,8,10,11] 
idx = [0] + [i+1 for i,(x,y) in enumerate(zip(input,input[1:])) if x+1!=y] + [len(input)] 
[ input[u:v] for u,v in zip(idx, idx[1:]) ] 
#output: 
[[1, 2], [4], [6, 7, 8], [10, 11]] 

enumerate()zip()를 사용하여

0

당신은 한 줄을 가지고 있지 않는 한 , 당신은 비 연속 요소를 칠 때까지 요소를 결합하는 간단한 생성 함수를 사용할 수 있습니다 :

def consec(lst): 
    it = iter(lst) 
    prev = next(it) 
    tmp = [prev] 
    for ele in it: 
     if prev + 1 != ele: 
      yield tmp 
      tmp = [ele] 
     else: 
      tmp.append(ele) 
     prev = ele 
    yield tmp 

출력 : 어떤 수입없이 내가 가지고있는

In [2]: lst = [1, 2, 4, 6, 7, 8, 10, 11] 

In [3]: list(consec(lst)) 
Out[3]: [[1, 2], [4], [6, 7, 8], [10, 11]] 
0

간단한 버전 : 하나 라이너보다 더

def mergeAdjNum(l): 
    r = [[l[0]]] 
    for e in l[1:]: 
     if r[-1][-1] == e - 1: 
      r[-1].append(e) 
     else: 
      r.append([e]) 
    return r 

약 33 % 더 빠르게.

def groupPrefStr(l): 
    pattern = re.compile(r'([a-z]+)([0-9]+)') 
    r = [[l[0]]] 
    pp, vv = re.match(pattern, l[0]).groups() 
    vv = int(vv) 
    for e in l[1:]: 
     p,v = re.match(pattern, e).groups() 
     v = int(v) 
     if p == pp and v == vv + 1: 
      r[-1].append(e) 
     else: 
      pp, vv = p, v 
      r.append([e]) 
    return r 

이 숫자 하나보다 훨씬 느립니다 :

이 하나의 코멘트에 언급 된 문자 접두사 그룹을 처리합니다. 접두사의 정확한 형식 (한 문자 만?)을 알면 re 모듈을 사용하지 않고 작업 속도를 높일 수 있습니다.

관련 문제