Saya memiliki daftar daftar dengan Python:
k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4]]
Dan saya ingin menghapus elemen duplikat darinya. Apakah jika itu daftar normal bukan daftar yang bisa saya gunakan set. Namun sayangnya daftar tersebut tidak dapat di-hash dan tidak dapat dijadikan kumpulan daftar. Hanya tupel. Jadi saya bisa mengubah semua daftar menjadi tupel kemudian menggunakan set dan kembali ke daftar. Tapi ini tidak cepat.
Bagaimana ini bisa dilakukan dengan cara yang paling efisien?
Hasil dari daftar di atas seharusnya:
k = [[5, 6, 2], [1, 2], [3], [4]]
Saya tidak peduli tentang menjaga ketertiban.
Catatan: pertanyaan ini serupa tetapi tidak sesuai dengan yang saya butuhkan. Mencari SO tetapi tidak menemukan duplikat yang tepat.
Pembandingan:
import itertools, time
class Timer(object):
def __init__(self, name=None):
self.name = name
def __enter__(self):
self.tstart = time.time()
def __exit__(self, type, value, traceback):
if self.name:
print '[%s]' % self.name,
print 'Elapsed: %s' % (time.time() - self.tstart)
k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [5, 2], [6], [8], [9]] * 5
N = 100000
print len(k)
with Timer('set'):
for i in xrange(N):
kt = [tuple(i) for i in k]
skt = set(kt)
kk = [list(i) for i in skt]
with Timer('sort'):
for i in xrange(N):
ks = sorted(k)
dedup = [ks[i] for i in xrange(len(ks)) if i == 0 or ks[i] != ks[i-1]]
with Timer('groupby'):
for i in xrange(N):
k = sorted(k)
dedup = list(k for k, _ in itertools.groupby(k))
with Timer('loop in'):
for i in xrange(N):
new_k = []
for elem in k:
if elem not in new_k:
new_k.append(elem)
"loop in" (metode kuadrat) tercepat dari semua untuk daftar pendek. Untuk daftar panjang, lebih cepat daripada semua orang kecuali metode groupby. Apakah ini masuk akal?
Untuk daftar singkat (yang ada di kode), 100000 iterasi:
[set] Elapsed: 1.3900001049
[sort] Elapsed: 0.891000032425
[groupby] Elapsed: 0.780999898911
[loop in] Elapsed: 0.578000068665
Untuk daftar yang lebih panjang (yang ada di kode digandakan 5 kali):
[set] Elapsed: 3.68700003624
[sort] Elapsed: 3.43799996376
[groupby] Elapsed: 1.03099989891
[loop in] Elapsed: 1.85900020599