Misalnya, diberi daftar ['one', 'two', 'one']
, algoritme harus kembali True
, sedangkan yang diberikan ['one', 'two', 'three']
harus kembali False
.
python
string
list
duplicates
teggy
sumber
sumber
Disarankan hanya untuk daftar pendek :
Jangan tidak digunakan pada daftar panjang - dapat mengambil waktu sebanding dengan kuadrat dari jumlah item dalam daftar!
Untuk daftar yang lebih panjang dengan item yang dapat hashable (string, angka, & c):
Jika item Anda bukan hashable (sublists, dicts, dll) itu menjadi hairier, meskipun masih mungkin untuk mendapatkan O (N logN) jika mereka setidaknya sebanding. Tetapi Anda perlu mengetahui atau menguji karakteristik item (hashable atau tidak, sebanding atau tidak) untuk mendapatkan kinerja terbaik yang Anda bisa - O (N) untuk hashable, O (N log N) untuk perbandingan yang tidak hashable, jika tidak itu ke O (N kuadrat) dan tidak ada yang bisa dilakukan tentang hal itu :-(.
sumber
all
Penghitung ) tentu saja jauh lebih lambat (membutuhkan jumlah semua 1). Diktik dengan semua nilai Benar, yang juga Anda sebutkan, adalah mimikri konyol yang tidak bergunaset
, tanpa nilai tambah apa pun. Big-O bukanlah segalanya dalam pemrograman.Ini sudah tua, tetapi jawaban di sini membawa saya ke solusi yang sedikit berbeda. Jika Anda siap untuk menyalahgunakan pemahaman, Anda bisa mengalami hubungan arus pendek dengan cara ini.
sumber
Jika Anda menyukai gaya pemrograman fungsional, berikut adalah fungsi yang berguna, didokumentasikan sendiri dan kode yang diuji menggunakan doctest .
Dari sana Anda dapat menguji unicity dengan memeriksa apakah elemen kedua dari pasangan yang dikembalikan kosong:
Perhatikan bahwa ini tidak efisien karena Anda secara eksplisit membangun dekomposisi. Namun sejalan dengan penggunaan pengurangan, Anda dapat menemukan sesuatu yang setara (tapi sedikit kurang efisien) untuk menjawab 5:
sumber
Saya pikir akan bermanfaat untuk membandingkan penentuan waktu dari berbagai solusi yang disajikan di sini. Untuk ini saya menggunakan perpustakaan saya sendiri
simple_benchmark
:Jadi memang untuk kasus ini solusi dari Denis Otkidach adalah yang tercepat.
Beberapa pendekatan juga menunjukkan kurva yang jauh lebih curam, ini adalah pendekatan yang skala kuadratik dengan jumlah elemen (solusi pertama Alex Martellis, wjandrea dan kedua solusi Xavier Decorets). Juga penting untuk disebutkan adalah bahwa solusi panda dari Keiku memiliki faktor konstan yang sangat besar. Tetapi untuk daftar yang lebih besar hampir mengejar ketinggalan dengan solusi lain.
Dan jika duplikat berada di posisi pertama. Ini berguna untuk melihat solusi mana yang mengalami hubungan arus pendek:
Di sini beberapa pendekatan tidak mengalami hubungan pendek: Kaiku, Frank, Xavier_Decoret (solusi pertama), Turn, Alex Martelli (solusi pertama) dan pendekatan yang disajikan oleh Denis Otkidach (yang tercepat dalam kasus tanpa duplikat).
Saya menyertakan fungsi dari perpustakaan saya sendiri di sini:
iteration_utilities.all_distinct
yang dapat bersaing dengan solusi tercepat dalam case tanpa duplikat dan bekerja dalam waktu konstan untuk kasus duplikat di awal (walaupun tidak secepat tercepat).Kode untuk tolok ukur:
Dan untuk argumennya:
sumber
Saya baru-baru ini menjawab pertanyaan terkait untuk membuat semua duplikat dalam daftar, menggunakan generator. Ini memiliki keuntungan bahwa jika digunakan hanya untuk menetapkan 'jika ada duplikat' maka Anda hanya perlu mendapatkan item pertama dan sisanya dapat diabaikan, yang merupakan jalan pintas utama.
Ini adalah pendekatan berbasis set yang menarik yang saya adaptasi langsung dari moooeeeep :
Dengan demikian, daftar lengkap dari dupes akan
list(getDupes(etc))
. Untuk sekadar menguji "jika" ada dupe, itu harus dibungkus sebagai berikut:Ini berskala dengan baik dan memberikan waktu operasi yang konsisten di mana pun dupe berada dalam daftar - Saya menguji dengan daftar hingga 1m entri. Jika Anda mengetahui sesuatu tentang data, khususnya, bahwa dupes cenderung muncul di babak pertama, atau hal-hal lain yang memungkinkan Anda mengubah persyaratan Anda, seperti perlu mendapatkan dupes yang sebenarnya, maka ada beberapa pelacak dupe alternatif yang benar-benar alternatif. yang mungkin mengungguli. Dua yang saya sarankan adalah ...
Pendekatan berbasis dict sederhana, sangat mudah dibaca:
Leverage itertools (dasarnya ifilter / izip / tee) pada daftar yang diurutkan, sangat efisien jika Anda mendapatkan semua dupes meskipun tidak secepat mendapatkan yang pertama:
Ini adalah pemain terbaik dari pendekatan yang saya coba untuk daftar dupe penuh , dengan dupe pertama terjadi di mana saja dalam daftar elemen 1m dari awal hingga tengah. Mengejutkan betapa sedikit overhead yang ditambahkan langkah semacam itu. Jarak tempuh Anda mungkin beragam, tetapi inilah hasil spesifik waktu saya:
sumber
.next()
panggilan dalam blok kode kedua Anda tidak bekerja pada Python 3.x. Saya pikirnext(getDupes(l))
harus bekerja di versi Python, jadi mungkin masuk akal untuk mengubahnya.ifilter
danìzip
dapat dengan mudah digantikan oleh built-infilter
danzip
dengan Python 3.x.Cara lain untuk melakukan ini secara ringkas adalah dengan Counter .
Untuk menentukan apakah ada duplikat dalam daftar asli:
Atau untuk mendapatkan daftar item yang memiliki duplikat:
sumber
sumber
Saya menemukan ini untuk melakukan kinerja terbaik karena hubungan pendek operasi ketika diduplikasi pertama kali ditemukan, maka algoritma ini memiliki kompleksitas ruang dan waktu O (n) di mana n adalah panjang daftar:
sumber
Saya tidak benar-benar tahu apa yang diatur di belakang layar, jadi saya hanya ingin membuatnya tetap sederhana.
sumber
Solusi yang lebih sederhana adalah sebagai berikut. Cukup periksa Benar / Salah dengan
.duplicated()
metode panda lalu ambil jumlah. Silakan juga lihat dokumentasi pandas.Series.duplicated - panda 0.24.1sumber
Jika daftar berisi item yang tidak dapat dihancurkan, Anda dapat menggunakan solusi Alex Martelli tetapi dengan daftar alih-alih set, meskipun lebih lambat untuk input yang lebih besar: O (N ^ 2).
sumber
Saya menggunakan pendekatan pyrospade, karena kesederhanaannya, dan memodifikasi sedikit pada daftar pendek yang dibuat dari registri Windows case-insensitive.
Jika string nilai PATH mentah dibagi menjadi jalur individual, semua jalur 'null' (string kosong atau hanya spasi) dapat dihapus dengan menggunakan:
PATH asli memiliki entri 'nol' dan duplikat untuk tujuan pengujian:
Jalur kosong telah dihapus, tetapi masih memiliki duplikat, misalnya, (1, 3) dan (13, 20):
Dan akhirnya, dupes telah dihapus:
sumber
sumber