Dalam jawaban ini, akan ada dua bagian: Dua solusi unik, dan grafik kecepatan untuk solusi spesifik.
Menghapus Item Duplikat
Sebagian besar jawaban ini hanya menghapus item duplikat yang dapat hashable , tetapi pertanyaan ini tidak menyiratkan itu tidak hanya membutuhkan item hashable , artinya saya akan menawarkan beberapa solusi yang tidak memerlukan item hashable .
collections.Counter adalah alat yang ampuh di perpustakaan standar yang bisa menjadi sempurna untuk ini. Hanya ada satu solusi lain yang bahkan memiliki Counter di dalamnya. Namun, solusi itu juga terbatas pada kunci hashable .
Untuk memperbolehkan kunci yang tidak dapat pecah di Counter, saya membuat kelas Container, yang akan mencoba untuk mendapatkan fungsi hash default objek, tetapi jika gagal, ia akan mencoba fungsi identitasnya. Ini juga mendefinisikan metode eq dan hash . Ini harus cukup untuk memungkinkan barang yang tidak dapat dihancurkan dalam solusi kami. Objek yang tidak bisa pecah akan diperlakukan seolah-olah objek tersebut dapat hashable. Namun, fungsi hash ini menggunakan identitas untuk objek-objek yang tidak bisa didapati, yang berarti dua objek yang sama-sama tidak bisa dilepas tidak akan berfungsi. Saya sarankan Anda menimpa ini, dan mengubahnya untuk menggunakan hash dari jenis yang bisa berubah-ubah (seperti menggunakan hash(tuple(my_list))
jika my_list
adalah daftar).
Saya juga membuat dua solusi. Solusi lain yang menjaga urutan barang, menggunakan subclass dari OrderedDict dan Counter yang dinamai 'OrderedCounter'. Sekarang, inilah fungsinya:
from collections import OrderedDict, Counter
class Container:
def __init__(self, obj):
self.obj = obj
def __eq__(self, obj):
return self.obj == obj
def __hash__(self):
try:
return hash(self.obj)
except:
return id(self.obj)
class OrderedCounter(Counter, OrderedDict):
'Counter that remembers the order elements are first encountered'
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))
def __reduce__(self):
return self.__class__, (OrderedDict(self),)
def remd(sequence):
cnt = Counter()
for x in sequence:
cnt[Container(x)] += 1
return [item.obj for item in cnt]
def oremd(sequence):
cnt = OrderedCounter()
for x in sequence:
cnt[Container(x)] += 1
return [item.obj for item in cnt]
remd adalah penyortiran yang tidak dipesan, oremd adalah penyortiran yang dipesan. Anda dapat dengan jelas mengetahui mana yang lebih cepat, tetapi saya akan menjelaskannya. Penyortiran yang tidak teratur sedikit lebih cepat. Itu menyimpan lebih sedikit data, karena tidak perlu dipesan.
Sekarang, saya juga ingin menunjukkan perbandingan kecepatan dari setiap jawaban. Jadi, saya akan melakukannya sekarang.
Fungsi mana yang tercepat?
Untuk menghapus duplikat, saya mengumpulkan 10 fungsi dari beberapa jawaban. Saya menghitung kecepatan setiap fungsi dan memasukkannya ke dalam grafik menggunakan matplotlib.pyplot .
Saya membagi ini menjadi tiga putaran grafik. Sebuah hashable adalah objek apa pun yang dapat hash, sebuah hashable adalah objek yang tidak dapat hash. Urutan berurutan adalah urutan yang mempertahankan pesanan, urutan yang tidak berurutan tidak mempertahankan pesanan. Sekarang, inilah beberapa istilah lagi:
Unordered Hashable adalah untuk metode apa pun yang menghapus duplikat, yang tidak selalu harus menjaga ketertiban. Itu tidak harus bekerja untuk orang yang tidak terluka, tetapi itu bisa.
Memesan Hashable adalah untuk metode apa pun yang menjaga urutan item dalam daftar, tetapi itu tidak harus bekerja untuk yang tak tergoyahkan, tetapi bisa.
Ordered Unhashable adalah metode apa pun yang menjaga urutan item dalam daftar, dan bekerja untuk unhashables.
Pada sumbu y adalah jumlah detik yang dibutuhkan.
Pada sumbu x adalah angka fungsi diterapkan.
Kami membuat urutan untuk hashable yang tidak berurutan dan memesan hashable dengan pemahaman sebagai berikut: [list(range(x)) + list(range(x)) for x in range(0, 1000, 10)]
Untuk pesanan yang belum dipesan: [[list(range(y)) + list(range(y)) for y in range(x)] for x in range(0, 1000, 10)]
Perhatikan ada 'langkah' dalam rentang karena tanpa itu, ini akan memakan waktu 10x lebih lama. Juga karena menurut pendapat pribadi saya, saya pikir itu mungkin terlihat sedikit lebih mudah dibaca.
Juga perhatikan kunci pada legenda adalah apa yang saya coba tebak sebagai bagian terpenting dari fungsi. Adapun fungsi apa yang paling buruk atau terbaik? Grafik berbicara sendiri.
Dengan itu diselesaikan, di sini adalah grafik.
Hashables yang Tidak Diatur
(Diperbesar)
Hashables Dipesan
(Diperbesar)
Tidak Terperintahkan Dipesan
(Diperbesar)