Apa cara terbaik (terbaik seperti cara konvensional) untuk memeriksa apakah semua elemen dalam daftar unik?
Pendekatan saya saat ini menggunakan Counter
adalah:
>>> x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
>>> counter = Counter(x)
>>> for values in counter.itervalues():
if values > 1:
# do something
Bisakah saya melakukan lebih baik?
len(x) > len(set(x))
adalah True bila elemen di dalamx
TIDAK unik. Judul ini pertanyaan ini meminta persis sebaliknya: "Memeriksa apakah semua elemen dalam daftar yang unik"Berikut adalah dua baris yang juga akan melakukan keluar lebih awal:
Jika elemen x tidak dapat di-hash, maka Anda harus menggunakan daftar untuk
seen
:sumber
Solusi keluar awal bisa jadi
Namun untuk kasus-kasus kecil atau jika keluar lebih awal bukanlah kasus yang umum maka saya berharap
len(x) != len(set(x))
menjadi metode tercepat.sumber
s = set()
...return not any(s.add(x) if x not in s else True for x in g)
len(x) != len(set(x))
menjadi lebih cepat dari ini jika keluar lebih awal tidak umum? Bukankah kedua operasi itu O (len (x)) ? (di manax
daftar aslinya)if x in s
di dalam O (len (x)) untuk loop.untuk kecepatan:
sumber
Bagaimana jika menambahkan semua entri ke satu set dan memeriksa panjangnya?
sumber
len()
.Alternatif untuk a
set
, Anda dapat menggunakan filedict
.sumber
Pendekatan lain sepenuhnya, menggunakan sort dan groupby:
Ini membutuhkan semacam, tetapi keluar pada nilai berulang pertama.
sumber
groupby
dan menemukan jawaban ini. Menurut saya ini paling elegan, karena ini adalah ekspresi tunggal dan bekerja dengan alat bawaan tanpa memerlukan variabel tambahan atau pernyataan loop.id()
fungsi untuk mengurutkannya karena ini merupakan prasyarat untukgroupby()
bekerja:groupby(sorted(seq), key=id)
Berikut adalah versi rekursif O (N 2 ) untuk bersenang-senang:
sumber
Berikut adalah fungsi keluar awal rekursif:
Ini cukup cepat bagi saya tanpa menggunakan konversi aneh (lambat) sambil memiliki pendekatan gaya fungsional.
sumber
H in T
melakukan pencarian linier, danT = L[1:]
menyalin bagian yang diiris dari daftar, jadi ini akan jauh lebih lambat daripada solusi lain yang telah disarankan pada daftar besar. Ini adalah O (N ^ 2) menurut saya, sementara sebagian besar lainnya adalah O (N) (set) atau O (N log N) (solusi berbasis pengurutan).Bagaimana dengan ini
sumber
Anda dapat menggunakan sintaks Yan (len (x)> len (set (x))), tetapi alih-alih set (x), tentukan fungsi:
dan lakukan len (x)> len (f5 (x)). Ini akan cepat dan juga menjaga ketertiban.
Kode di sana diambil dari: http://www.peterbe.com/plog/uniqifiers-benchmark
sumber
x = range(1000000) + range(1000000)
, menjalankan set (x) lebih cepat dari f5 (x). Urutan bukanlah persyaratan dalam pertanyaan tetapi bahkan menjalankan terurut (set (x)) masih lebih cepat dari f5 (x)Menggunakan pendekatan serupa dalam bingkai data Pandas untuk menguji apakah konten kolom berisi nilai unik:
Bagi saya, ini instan pada variabel int dalam kerangka tanggal yang berisi lebih dari satu juta baris.
sumber
semua jawaban di atas bagus tapi saya lebih suka menggunakan
all_unique
contoh python dari 30 detikAnda perlu menggunakan
set()
daftar yang diberikan untuk menghapus duplikat, bandingkan panjangnya dengan panjang daftar.ia mengembalikan
True
jika semua nilai dalam daftar datar adalahunique
,False
sebaliknyasumber
Untuk pemula:
sumber