2017-03-27 9 views
1

나는이 목록을 가지고 내가 같은 층의 기능 번호를 삭제하고 각 정수의 첫 번째 번호를 얻으려면파이썬 : 목록에서 같은 층의 기능 번호를 제거

x = [1.1, 1.2, 1.2, 2.1, 2.2, 3.0, 4.5] 

:

x = [1.1, 2.1, 3.0, 4.5] 

나는

x = [1.1, 1.2, 1.2, 2.1, 2.2, 3.0, 4.5] 
def h(l): 
    y = [] 
    for i in l: 
     if int(i) != int(i+1): 
      z = i 
      y.append(z) 
    return(y) 
print(h(x)) 

을 시도하지만 인쇄 할 때이 목록과 같은 결과를 얻을 수 있습니다

012 3,516,
+0

당신은 무엇을하려고 않았다 groupby를 사용하는 것보다 그 훨씬 빠른 정렬되지 않은 데이터의 경우? 최신 시도를 보여주고 어려움을 설명 할 수 있습니까? – idjaw

+0

는 I 시도 'X = [1.1, 2.1, 3.0, 4.5]' '데프 H (l) :'y는 L에서 I에 대해 [] ' '= ' 'INT (I)의 경우! ='z = i' 'y.append (z)' 'return (y)' 하지만 목록과 같은 결과가 나온다 x – Danny

+0

"첫 번째로 발생 ... ", 우리는 목록이 정렬되어 있다고 가정합니까? – smci

답변

3

당신은 처음

out = [next(g) for k, g in itertools.groupby(x, floor)] 
out 
# [1.1, 2.1, 3.0, 4.5] 
0

변환을 나열하는 설정 최소 기능에 작은 키 매핑 및 작동 itertools.groupbyx 경우 종류의 정렬되지 않습니다 사용할 수 있습니다

import numpy as np 

x = [1.1, 1.2, 1.2, 2.1, 2.2, 3.0, 4.5] 
z = list(set([min(x, key=lambda i: i - np.floor(c) if i >= np.floor(c) else max(x)) for c in x])) 
print(z) 
0

사용하는 것보다 더 일반적인 솔루션 itertools.groupby 어느 쪽도 입력 데이터가 정렬되어 있다고 가정하지 않으며 출력 정렬을 원한다고 가정하지도 않습니다.

def first_floor(numbers): 
    seen = set() 
    for x in numbers: 
     f = floor(x) 
     if f not in seen: 
      seen.add(f) 
      yield x 
그런 다음

는 : 정렬 된 데이터의 경우

>>> x = [1.1, 1.2, 1.2, 2.1, 2.2, 3.0, 4.5] 
>>> list(first_floor(x)) 
[1.1, 2.1, 3.0, 4.5] 

이 거의 빠릅니다. 정렬 및

>>> x = [random.random()*10 for i in range(100)] 
>>> %timeit [next(g) for k, g in itertools.groupby(sorted(x), floor)] 
1000000 loops, best of 3: 19 µs per loop 
>>> %timeit list(first_floor2(x)) 
1000000 loops, best of 3: 12.6 µs per loop