2014-01-08 2 views
3

비슷한 항목이지만 처음과 마지막 부분을 모두 제거하려는 항목 목록이 있습니다. 예를 들어목록에서 비슷한 항목을 제거하는 파이썬 방법

listIn = [1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1] 
  1. 처음 세 요소 "1, 1, 1"은 유사하므로 중간 "1"을 제거한다.
  2. 다음 두 개의 0은 수정되지 않습니다.
  3. 하나 하나입니다. 수정하지 않고 그대로 둡니다.
  4. 4 개의 제로. 첫 번째와 마지막 사이에있는 항목을 제거하십시오. 결과

:

listOut = [1, 1, 0, 0, 1, 0, 0, 1] 

의 C++에서이 일을하는 방법은 매우 분명하다,하지만 파이썬 코딩 스타일에서 매우 다른 보인다. 아니면 유일한 방법입니까? A와 첨가 효율,

from itertools import groupby 

listOut = [] 
for value, group in groupby(listIn): 
    listOut.append(next(group)) 
    for i in group: 
     listOut.append(i) 
     break 

또는 : 가치관 그룹 enter image description here

답변

6

사용 itertools.groupby() :

기본적으로, 단지 "Y"값이 변경되지 않는 그래프에서 과도 점을 제거 발전기 :

from itertools import groupby 

def reduced(it): 
    for value, group in groupby(it): 
     yield next(group) 
     for i in group: 
      yield i 
      break 

데모 :

,515,
>>> listIn = [1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1] 
>>> list(reduced(listIn)) 
[1, 1, 0, 0, 1, 0, 0, 1] 
+0

itertools의 긴 수명, 기본적으로 제목에'list'가있는 질문에 대한 해결책입니다. – bgusach

+0

그건 정확히 파이썬과 itertools에서 기대했던 것입니다. 완벽한 솔루션. –

1

한 줄이 문제에 대한 해결책을 제공 numpythonic

listOut = reduce(lambda x, y: x if x[-1] == y and x[-2] == y else x + [y], listIn, listIn[0:2]) 
1

; itertools를 기반으로하는 것보다 큰 배열의 경우 훨씬 더 빠릅니다. 당신이 어떤 종류의 신호 처리를하고 있다면 아마도 numpy를 사용해야 할 이유가 충분히있을 것입니다.

import numpy as np 
a = np.array([1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1], np.int) 

change = a[:-1] != a[1:] 
I = np.zeros_like(a, np.bool) 
I[:-1] = change 
I[1:] += change 
print a[I] 
+0

우수한 numpy 솔루션. 그러나, np에서 초보자로서 그것을 감사하는 데 시간이 좀 걸렸습니다 : D 조 –