Baru-baru ini saya perhatikan bahwa ketika saya mengubah a list
ke set
urutan elemen diubah dan diurutkan berdasarkan karakter.
Pertimbangkan contoh ini:
x=[1,2,20,6,210]
print x
# [1, 2, 20, 6, 210] # the order is same as initial order
set(x)
# set([1, 2, 20, 210, 6]) # in the set(x) output order is sorted
Pertanyaan saya adalah -
- Mengapa ini terjadi?
- Bagaimana saya bisa melakukan operasi set (terutama Set Difference) tanpa kehilangan urutan awal?
unique = list(dict.fromkeys([1, 2, 1]).keys())
. Ini berfungsi karenadict
s menyimpan urutan penyisipan sekarang.Jawaban:
A
set
adalah struktur data yang tidak berurutan, sehingga tidak mempertahankan urutan penyisipan.Ini tergantung pada kebutuhan Anda. Jika Anda memiliki daftar normal, dan ingin menghapus beberapa set elemen sambil mempertahankan urutan daftar, Anda dapat melakukannya dengan pemahaman daftar:
Jika Anda memerlukan struktur data yang mendukung uji keanggotaan cepat dan pelestarian urutan penyisipan , Anda dapat menggunakan kunci kamus Python, yang mulai dari Python 3.7 dijamin akan mempertahankan urutan penyisipan:
b
tidak perlu dipesan di sini - Anda juga bisa menggunakan aset
. Perhatikan bahwaa.keys() - b.keys()
mengembalikan perbedaan set sebagaiset
, jadi itu tidak akan mempertahankan urutan penyisipan.Di Python versi lama, Anda bisa menggunakan
collections.OrderedDict
:sumber
None
adalah bahasa tunggal yang dijamin. Di CPython, biaya sebenarnya hanyalah penunjuk (meskipun biaya itu selalu ada, tetapi untuk sebuah dict, Anda hampir dapat mempertimbangkanNone
dan single lain atau referensi bersama "gratis"), jadi kata mesin, kemungkinan 8 byte pada komputer modern . Tapi ya, itu tidak seefisien ruang seperti yang bisa dilakukan satu set.dict.fromkeys([1, 2, 1]).keys()
karena biasadict
menjaga ketertiban juga.Di Python 3.6,ada solusi lain untuk Python 2 dan 3:set()
sekarang harus menjaga urutannya, tetapisumber
x.index
dipanggil, pencarian linier dilakukan. Jika Anda baik-baik saja dengan kompleksitas kuadrat, tidak ada alasan untuk menggunakan aset
sejak awal.set()
tidak dipesan dengan Python 3.6, bahkan sebagai detail implementasi, Anda memikirkandict
sint
seringx=[1,2,-1,20,6,210]
dan jadikan satu set. Anda akan melihat itu tidak dipesan sama sekali, diuji dengan Python 3.6.Menjawab pertanyaan pertama Anda, kumpulan adalah struktur data yang dioptimalkan untuk operasi kumpulan. Seperti himpunan matematika, ia tidak menegakkan atau mempertahankan urutan elemen tertentu. Konsep abstrak dari suatu himpunan tidak memaksakan keteraturan, jadi implementasi tidak diperlukan. Saat Anda membuat set dari daftar, Python memiliki kebebasan untuk mengubah urutan elemen untuk kebutuhan implementasi internal yang digunakannya untuk sebuah set, yang mampu melakukan operasi set secara efisien.
sumber
Hapus duplikat dan pertahankan ketertiban dengan fungsi di bawah ini
periksa tautan ini
sumber
Dalam matematika, ada himpunan dan himpunan terurut (osets).
Di Python, hanya set yang diimplementasikan secara langsung. Kita dapat meniru osets dengan tombol dict biasa ( 3.7+ ).
Diberikan
Kode
Demo
Replikasi dihapus, urutan penyisipan dipertahankan.
Operasi set-like pada tombol dikt.
Detail
Catatan: struktur tak berurutan tidak menghalangi elemen berurutan. Sebaliknya, ketertiban yang terjaga tidak dijamin. Contoh:
Seseorang mungkin senang mengetahui bahwa list dan multiset (mset) adalah dua struktur data matematika yang lebih menarik:
Ringkasan
* Sebuah multiset dapat secara tidak langsung ditiru dengan
collections.Counter()
, pemetaan multiplisitas seperti diktik (hitungan).sumber
Seperti yang dilambangkan dalam jawaban lain, himpunan adalah struktur data (dan konsep matematika) yang tidak mempertahankan urutan elemen -
Namun, dengan menggunakan kombinasi set dan kamus, Anda dapat mencapai apa pun yang Anda inginkan - coba gunakan cuplikan berikut:
sumber
Berdasarkan jawaban Sven, saya menemukan menggunakan collections.OrderedDict seperti itu membantu saya mencapai apa yang Anda inginkan dan memungkinkan saya menambahkan lebih banyak item ke dict:
Jika Anda ingin menambahkan item tetapi tetap memperlakukannya seperti satu set, Anda dapat melakukannya:
Dan Anda bisa melakukan operasi seperti z.keys () pada dict dan mendapatkan setnya:
sumber
list(z.keys())
untuk mendapatkan keluaran daftar.Penerapan konsep skor tertinggi di atas yang mengembalikannya ke daftar:
Diuji (secara singkat) pada Python 3.6 dan Python 2.7.
sumber
Jika Anda memiliki sejumlah kecil elemen di dua daftar awal yang ingin Anda lakukan operasi setel perbedaan, alih-alih menggunakan
collections.OrderedDict
yang mempersulit implementasi dan membuatnya kurang dapat dibaca, Anda dapat menggunakan:Kompleksitas waktunya tidak begitu bagus tetapi rapi dan mudah dibaca.
sumber
Menarik bahwa orang selalu menggunakan 'masalah dunia nyata' untuk membuat lelucon tentang definisi dalam ilmu teoritis.
Jika set memiliki urutan, Anda harus terlebih dahulu mencari tahu masalah berikut. Jika daftar Anda memiliki elemen duplikat, bagaimana urutannya saat Anda mengubahnya menjadi satu set? Apa urutannya jika kita menggabungkan dua set? Berapakah urutannya jika kita memotong dua himpunan dengan urutan berbeda pada elemen yang sama?
Plus, set jauh lebih cepat dalam mencari kunci tertentu yang sangat baik dalam operasi set (dan itulah mengapa Anda memerlukan set, tetapi bukan daftar).
Jika Anda benar-benar peduli tentang indeks, simpan saja sebagai daftar. Jika Anda masih ingin melakukan operasi set pada elemen dalam banyak daftar, cara paling sederhana adalah membuat kamus untuk setiap daftar dengan kunci yang sama di set bersama dengan nilai daftar yang berisi semua indeks kunci dalam daftar asli.
sumber
Berikut cara mudah melakukannya:
sumber