Metode di tempat
Metode ini kuadratik, karena kami memiliki pencarian linier ke dalam daftar untuk setiap elemen daftar (untuk itu kami harus menambahkan biaya menata ulang daftar karena del
s).
Yang mengatakan, adalah mungkin untuk beroperasi di tempat jika kita mulai dari akhir daftar dan melanjutkan ke asal menghapus setiap istilah yang ada di sub-daftar di sebelah kirinya
Ide dalam kode ini sederhana
for i in range(len(l)-1,0,-1):
if l[i] in l[:i]: del l[i]
Tes implementasi yang sederhana
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
bisa saja berubah di antara iterasi, dan runtime tidak cukup pintar untuk mengesampingkan itu. Untuk bermain aman, ia harus memeriksa objek setiap kali. - Jika Anda melihat bytecode dengandis.dis(f)
, Anda dapat melihat bahwa bytecode dieksekusiLOAD_ATTR
untukadd
anggota pada setiap iterasi. ideone.com/tz1Tll