2012-02-21 3 views
0

중복 된 항목 만 제거하고 정렬합니다. 나는 모든 항목의 하나의 인스턴스를 제거하고 그것에있는 항목들로 새로운 목록을 반환해야한다. , collections.Counter모든 값의 한 인스턴스가 제거 된 목록의 복사본을 반환합니다.

def rem(iterable): 
    c = collections.Counter(iterable) 
    for k in c: 
     c[k] -= 1 
    return sorted(c.elements()) 

파이썬에서 버전 2.7 이전 인 :

>>> rem([4]) 
[] 
>>> rem([4,4]) 
[4] 
>>> rem([4, 1, 3, 2]) 
[] 
>>> rem([2, 4, 2, 4, 4]) 
[2, 4, 4] 
+0

당신이 스벤 감사합니다 당신의 대답은 내가 필요로 그냥 뭐 제공, 당신은 오히려 빠른 응답 : 그냥 당신은 이미 그 값을 볼 경우 현재 값을 추적하고 단지 새로운 하나를 추가 할 변수를 추가 너무! – AngelE

답변

3

쉽게 구현이 collections.Counter 사용하는 것입니다

def rem(nlst): 
    n = [] 
    for x in nlst: 
     if x not in n: 
      n.append(x) 
      n.sort() 
    return n 

이 그것을해야 할 것입니다 : 이것은 내가 무엇을 가지고 사용 불가. 당신은 이미 대신에 본 항목을 기록하는 세트를 사용할 수 있습니다

def rem(iterable): 
    result = [] 
    seen = set() 
    for x in iterable: 
     if x in seen: 
      result.append(x) 
     else: 
      seen.add(x) 
    result.sort() 
    return result 
+0

아 ... 카운터! 훌륭한 사용법. – sberry

0
y = x[:] 
for r in set(x): 
    y.remove(r) 
+0

이것은 꽤 간결하지만 O (n^2)이기 때문에이 구현을 피했습니다. –

+0

빠른 성능이 명시 적으로 요구 사항에 명시되지 않는 한 보통 나는 단순하고 비단뱀적인 솔루션을 선호합니다. – wim

0

코드에 약간의 비틀기 확인을 작동하는 것 같다.

def rem(nlist): 
    n = [] 
    nlist.sort() 
    cur = None 
    for x in nlist: 
     if x == cur: 
      n.append(x) 

     cur = x 

    return n 

~

관련 문제