2013-03-17 2 views
4

임의의 항목 목록 (예 : 목록 목록)에서 여러 항목을 모두 제거하는 가장 빠른 방법은 무엇입니까? 결과적으로 목록에서 한 번만 나타나는 항목 만 표시되어 모든 중복 항목이 제거됩니다.목록에서 여러 항목을 모두 제거하는 가장 빠른 방법은 무엇입니까?

입력 [[1,2], [1,3], [1,4], [1,2], [1,4], [1, 2]

출력 : [1, 3]]

이 솔루션은 느렸다 :

duplicates = [] 
output = [] 
for item in input: 
    if not item in duplicates: 
     if item in output: 
      output.remove(item) 
      duplicates.append(item) 
     else: 
      output.append(item) 

목록을 정렬 처음으로 아마, 더 좋은 해결책이 :

output = [item for item in input if input.count(item)==1] 

이 솔루션은 빠른입니까? 어떤 아이디어라도 감사합니다.

답변

8

당신이 보존 순서에 대해 걱정하지 않는 경우 :

from collections import Counter 

def only_uniques(seq): 
    return [k for k,n in Counter(seq).iteritems() if n == 1] 

당신이 보존 주문에 대한 관심이없는 경우 :

from collections import Counter 

def only_uniques_ordered(seq): 
    counts = Counter(seq) 
    return [k for k in seq if counts[k] == 1] 

두 알고리즘은 O(n) 시간에 실행됩니다.


편집

:는 목록의 목록을했다 잊어 버렸습니다.

list_of_tuples = [tuple(k) for k in list_of_lists] 

을 그리고 대신 위의 기능 중 하나를 통해 list_of_tuples을 실행 순서를 해시 할 수 있도록하기 위해, 당신이 이런 식으로 뭔가를 할 수 있도록, 불변 할 필요가있다. 튜플의 목록을 다시 얻게 될 것입니다. 그러나이 후에 시퀀스를 다시 수정하지 않는 한, 튜플은 사용자 목적에 맞게 잘 작동해야합니다.

다시 변환 할 필요성을 경우

, 그것은 거의 동일합니다 :

list_of_lists = [list(k) for k in list_of_tuples] 
+0

이 솔루션이 오류를 제공합니다. 어떤 생각을 어떻게 해결할 수 있을까요? – Meilo

+0

아, 그래, 처음에는 목록의 목록을 가지고 싶었어.여기서 중요한 문제는 목록이 변경 가능하기 때문에 목록이 해시 가능하지 않다는 것입니다. 예를 들어 * 튜플 * 목록이 있으면 제대로 작동합니다. 나는 실행하기 전에 튜플로 변환하는 예제적인 방법으로 편집했다. – Amber

+0

고마워, 그건 잘 작동하고 내 초기 솔루션보다 100의 크기에 빠릅니다. 그러나 귀하의 답변을 수락하기 전에 누군가가 그 해결책을 이길 수 있는지 알아 보겠습니다. – Meilo

2
a = [[1, 2], [1, 3], [1, 4], [1, 2], [1, 4], [1, 2]] 
print list(set(tuple(i) for i in a)) 

하나 이상 라이너가 작업을 수행합니다.

사용자 $ 시간 파이썬 foo.py
[(1,2), (1,3), (1,4)]

실제 0m0.037s
사용자
SYS를 0m0.024s 0m0 .010s

Questioner가 요청한 고유 항목 만 인쇄하십시오. 솔루션은 컬렉션 모듈을 사용하지 않는다는 점을 제외하고는 앰버의 해결책의 변형입니다.

a = [[1, 2], [3, 4], [1, 3], [1, 4], [1, 2], [1, 4], [1, 2]] 
d = {tuple(i): a.count(i) for i in a} 
print [k for k, v in d.iteritems() if v == 1] 

출력 : 형식 오류 : unhashable 유형 : '목록'

[(1, 3), (3, 4)] 
+0

그건 OP가 요구했던 것이 아닙니다 ... 당신의 결과물을 OP가 제공 한 샘플 출력물과 비교하십시오. – Amber

+0

호박색이 맞습니다.이 솔루션은 원하는 출력과 일치하지 않습니다. – Meilo

+0

(1)'set '을 호출 한 후에는 명령을 보존한다고 주장 할 수 없습니다. (2)'a'에서 각'i'에 대해'a.count (i) '를 호출하는 것은 큰'a'에서 매우 느릴 것입니다. – DSM

관련 문제