적절한 방법
이 방법은 목록의 모든 요소에 대해 목록을 선형으로 조회하기 때문에 2 차법입니다 (따라서 목록 정렬에 따른 비용을 추가해야 함). del
s ).
즉, 목록의 끝에서 시작하여 왼쪽의 하위 목록에있는 각 용어를 제거하여 원점으로 진행하면 제자리에서 작업 할 수 있습니다
코드 에서이 아이디어는 단순히
for i in range(len(l)-1,0,-1):
if l[i] in l[:i]: del l[i]
간단한 구현 테스트
In [91]: from random import randint, seed
In [92]: seed('20080808') ; l = [randint(1,6) for _ in range(12)] # Beijing Olympics
In [93]: for i in range(len(l)-1,0,-1):
...: print(l)
...: print(i, l[i], l[:i], end='')
...: if l[i] in l[:i]:
...: print( ': remove', l[i])
...: del l[i]
...: else:
...: print()
...: print(l)
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]
In [94]:
seen.add
은 반복 사이에서 변경 되었을 수 있으며 런타임은 그것을 배제하기에 충분하지 않습니다. 안전하게 플레이하려면 매번 물체를 확인해야합니다. -로 바이트 코드를 보면 각 반복 에서 멤버에 대해dis.dis(f)
실행되는 것을 볼 수 있습니다 . ideone.com/tz1TllLOAD_ATTR
add