2012-05-11 3 views
10

목록 통합을 사용하여 목록에서 중복 항목을 제거하는 방법은 무엇입니까? 다만 동일한 목록을 생성,목록 통합을 사용하여 목록에서 중복 항목을 제거하는 방법?

a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8] 
b = [] 
b = [item for item in a if item not in b] 

하지만이 작동하지 않습니다 나는 다음과 같은 코드가 있습니다. 왜 그것의 동일한 목록을 생산?

+4

'b가 없으면 항목이 실행됩니다.'순간에 'b'가 비어 있기 때문에. 목록 이해력은 메모리에서 이루어지며 그 결과는 마지막에 'b'에 할당됩니다. –

+0

[알고리즘 - 목록에서 중복 요소를 효율적으로 삭제하는 방법?] (http://stackoverflow.com/questions/1801459/algorithm-how-to-delete-duplicate-elements-in-a-list-efficiently) –

+0

즉, 목록 이해가 루프처럼 작동하지 않는다는 의미입니까? – Alinwndrld

답변

13

는 실행시에 요소가없는. 당신이이 원하는 것 무엇 :

>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8] 
>>> b = [] 
>>> [b.append(item) for item in a if item not in b] 
[None, None, None, None, None, None, None, None] 
>>> b 
[1, 2, 3, 5, 9, 6, 8, 7] 
+14

[부작용에 대한 목록 작성] (http://stackoverflow.com/q/5753597/566644)을주의하십시오. 대신에 for 일반 루프를 사용하십시오. –

7

는 지능형리스트와 다른 기술을 사용하여 괜찮다면 당신이 그것에 대해 집합 사용할 수 있습니다

>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8] 
>>> b = list(set(a)) 
>>> print b 
[1, 2, 3, 5, 6, 7, 8, 9] 
+0

나는 set 함수를 살펴 봤는데 위의 코드에 무엇이 잘못되었는지 알기를 원합니다. – Alinwndrld

+2

세트는 초기 주문을 유지하지 않으므로 ... –

3

사용 keysdict에의 키와 같은 a의 값으로 구성합니다.

b = dict([(i, 1) for i in a]).keys() 

또는 세트 사용 : 그것은 b으로 동일한 목록을 생성하는 것

b = [i for i in set(a)] 
4

목록이 변경되지하는 이유는 b가 비어 밖으로 시작한다는 것입니다. 즉, if item not in b은 항상 True입니다. 목록이 생성 된 후에 만 ​​변수 b에 할당 된이 비어 있지 않은 새 목록이 추가됩니다.

+1

올바르게 이해하면 목록 이해력은 루프와 같이 한 번에 하나씩 각 항목을 확인하고 추가하는 대신 항목을 하나씩 추가한다는 의미입니다. – Alinwndrld

+1

@Alinwndrld : 나는 그것이 유효한 결론이라고 생각하지 않습니다. 그것은 단지 목록의 이해력이 과제 전에 평가된다는 것을 의미합니다. 목록은 내부적으로 루프 안에 구축 될 수 있습니다. –

2

사용 groupby : 당신은 상관하지 않을 경우 주문하는 값이 처음으로 원래 목록에 등장 대해

>>> from itertools import groupby 
>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8] 
>>> [k for k, _ in groupby(sorted(a, key=lambda x: a.index(x)))] 
[1, 2, 3, 5, 9, 6, 8, 7] 

는, 예를 키 인수를 남겨주세요

>>> [k for k, _ in groupby(sorted(a))] 
[1, 2, 3, 5, 6, 7, 8, 9] 

groupby으로 멋진 일을 할 수 있습니다.

>>> [k for k, v in groupby(sorted(a)) if len(list(v)) > 1] 
[2, 3, 5, 8] 

또는 주파수 사전을 구축하기 : 여러 번 표시되는 항목을 확인하려면

>>> {k: len(list(v)) for k, v in groupby(sorted(a))} 
{1: 1, 2: 3, 3: 4, 5: 4, 6: 1, 7: 1, 8: 2, 9: 1} 

itertools 모듈에서 매우 유용한 기능이 있습니다 chain, teeproduct이 몇 가지 이름은 !

1
>>> a = [10,20,30,20,10,50,60,40,80,50,40,0,100,30,60] 
>>> [a.pop(a.index(i, a.index(i)+1)) for i in a if a.count(i) > 1] 
>>> print(a) 
관련 문제