Dengan Python, kapan harus menggunakan Kamus, Daftar atau Set?

294

Kapan saya harus menggunakan kamus, daftar atau set?

Apakah ada skenario yang lebih cocok untuk setiap tipe data?

Blankman
sumber

Jawaban:

603

A listtetap memesan, dictdan setjangan: ketika Anda peduli tentang pesanan, oleh karena itu, Anda harus menggunakan list(jika pilihan wadah Anda terbatas pada tiga ini, tentu saja ;-).

dictmengaitkan dengan masing-masing kunci suatu nilai, sementara listdan sethanya berisi nilai: kasus penggunaan yang sangat berbeda, jelas.

setmembutuhkan item yang dapat hashable, listtidak: jika Anda memiliki item non-hashable, oleh karena itu, Anda tidak dapat menggunakan setdan sebaliknya harus menggunakan list.

setmelarang duplikat, listtidak: juga perbedaan penting. ("Multiset", yang memetakan duplikat ke dalam penghitungan berbeda untuk item yang hadir lebih dari satu kali, dapat ditemukan di collections.Counter- Anda dapat membuat satu sebagai dict, jika karena alasan aneh Anda tidak dapat mengimpor collections, atau, pada pra-2.7 Python sebagai a collections.defaultdict(int), menggunakan item sebagai kunci dan nilai terkait sebagai penghitungan).

Memeriksa keanggotaan nilai dalam set(atau dict, untuk kunci) sangat cepat (memakan waktu yang konstan dan singkat), sementara dalam daftar dibutuhkan waktu sebanding dengan panjang daftar dalam kasus rata-rata dan terburuk. Jadi, jika Anda memiliki item hashable, tidak peduli dengan cara apa pun tentang pemesanan atau duplikat, dan ingin pengecekan keanggotaan yang cepat, setlebih baik daripada list.

Alex Martelli
sumber
6
Perhatikan bahwa Python 3.7 telah dipesan secara default
Gigi Bayte 2
172
  • Apakah Anda hanya perlu urutan item yang dipesan? Cari daftar.
  • Apakah Anda hanya perlu tahu apakah Anda sudah mendapat nilai tertentu, tetapi tanpa memesan (dan Anda tidak perlu menyimpan duplikat)? Gunakan satu set.
  • Apakah Anda perlu mengaitkan nilai dengan kunci, sehingga Anda dapat mencarinya secara efisien (dengan kunci) nanti? Gunakan kamus.
Jon Skeet
sumber
30
Ini harus menjadi bagian "TL; DR" untuk jawaban di atas oleh Alex M. :-)
Alex Boschmans
9
Saya pikir itu sebaliknya .. Alex harus menyumbangkan suaranya kepada Jon. Jawaban ini mencakup hampir semua hal dan jauh lebih ringkas dan jelas.
mehmet
Namun, jika Anda ingin mengetahui perbedaan kompleksitas waktu di antara tipe-tipe data ini, penjelasan Alex berfungsi lebih baik
kcEmenike
19

Saat Anda menginginkan koleksi elemen unik yang tidak diurut, gunakan a set. (Misalnya, ketika Anda ingin himpunan semua kata yang digunakan dalam dokumen).

Saat Anda ingin mengumpulkan daftar elemen yang tidak dapat diubah, gunakan a tuple. (Misalnya, ketika Anda menginginkan pasangan (nama, nomor telepon) yang ingin Anda gunakan sebagai elemen dalam suatu set, Anda akan memerlukan sebuah tuple daripada daftar karena set membutuhkan elemen yang tidak dapat diubah).

Saat Anda ingin mengumpulkan daftar elemen yang dapat diubah yang dapat diubah, gunakan a list. (Misalnya, ketika Anda ingin menambahkan nomor telepon baru ke daftar: [number1, number2, ...]).

Saat Anda ingin pemetaan dari kunci ke nilai, gunakan a dict. (Misalnya, ketika Anda menginginkan buku telepon yang memetakan nama ke nomor telepon:) {'John Smith' : '555-1212'}. Perhatikan bahwa kunci-kunci dalam dict tidak berurutan. (Jika Anda beralih melalui dict (buku telepon), kunci (nama) dapat muncul dalam urutan apa pun).

unutbu
sumber
Eh, dia tidak bertanya tentang tuple.
habnabit
18
  • Gunakan kamus saat Anda memiliki satu set kunci unik yang memetakan ke nilai.

  • Gunakan daftar jika Anda memiliki koleksi barang yang dipesan.

  • Gunakan satu set untuk menyimpan satu set item yang tidak teratur.

Slaks
sumber
6

Singkatnya, gunakan:

list - jika Anda memerlukan urutan item yang dipesan.

dict - jika Anda perlu menghubungkan nilai dengan kunci

set - jika Anda perlu menyimpan elemen unik.

Penjelasan detail

Daftar

Daftar adalah urutan yang bisa berubah, biasanya digunakan untuk menyimpan koleksi item yang homogen.

Daftar mengimplementasikan semua operasi urutan umum:

  • x in l dan x not in l
  • l[i], l[i:j],l[i:j:k]
  • len(l), min(l),max(l)
  • l.count(x)
  • l.index(x[, i[, j]])- indeks kemunculan pertama xin l(pada atau setelah idan sebelum jindeces)

Daftar juga mengimplementasikan semua operasi urutan yang bisa berubah:

  • l[i] = x- Item idari ldigantikan olehx
  • l[i:j] = t- Sepotong ldari ike jdigantikan oleh isi dari iterablet
  • del l[i:j] - sama dengan l[i:j] = []
  • l[i:j:k] = t- elemen l[i:j:k]digantikan oleh element
  • del l[i:j:k]- menghapus elemen dari s[i:j:k]daftar
  • l.append(x)- ditambahkan xke akhir urutan
  • l.clear()- menghapus semua item dari l(sama dengan del l[:])
  • l.copy()- membuat salinan dangkal l(sama seperti l[:])
  • l.extend(t)atau l += t- meluas ldengan isit
  • l *= n- Pembaruan ldengan isinya berulang nkali
  • l.insert(i, x)- menyisipkan xke dalam lpada indeks yang diberikan olehi
  • l.pop([i])- mengambil item di idan juga menghilangkannyal
  • l.remove(x)- hapus item pertama dari ltempat l[i]yang sama dengan x
  • l.reverse()- membalikkan item ldi tempat

Daftar dapat digunakan sebagai tumpukan dengan memanfaatkan metode appenddan pop.

Kamus

Kamus memetakan nilai hashable ke objek arbitrer. Kamus adalah objek yang bisa berubah. Operasi utama pada kamus adalah menyimpan nilai dengan beberapa kunci dan mengekstraksi nilai yang diberikan kunci.

Dalam kamus, Anda tidak dapat menggunakan sebagai nilai kunci yang tidak dapat hashable, yaitu nilai yang berisi daftar, kamus, atau jenis yang bisa berubah-ubah lainnya.

Set

Satu set adalah kumpulan objek hashable berbeda yang tidak berurutan. Satu set umumnya digunakan untuk memasukkan pengujian keanggotaan, menghapus duplikat dari urutan, dan menghitung operasi matematika seperti persimpangan, gabungan, perbedaan, dan perbedaan simetris.

lmiguelvargasf
sumber
5

Meskipun ini tidak mencakup sets, ini adalah penjelasan yang baik tentang dicts dan lists:

Daftar adalah apa yang tampak - daftar nilai. Masing-masing dari mereka diberi nomor, mulai dari nol - yang pertama diberi nomor nol, yang pertama 1, yang kedua 2, dll. Anda dapat menghapus nilai dari daftar, dan menambahkan nilai baru ke akhir. Contoh: Banyak nama kucing Anda.

Kamus mirip dengan yang disarankan namanya - kamus. Dalam kamus, Anda memiliki 'indeks' kata-kata, dan untuk masing-masing definisi. Dalam python, kata tersebut disebut 'kunci', dan definisi adalah 'nilai'. Nilai-nilai dalam kamus tidak bernomor - mirip dengan apa yang namanya - kamus. Dalam kamus, Anda memiliki 'indeks' kata-kata, dan untuk masing-masing definisi. Nilai-nilai dalam kamus tidak diberi nomor - mereka tidak dalam urutan tertentu, baik - kunci melakukan hal yang sama. Anda dapat menambah, menghapus, dan mengubah nilai-nilai dalam kamus. Contoh: buku telepon.

http://www.sthurlow.com/python/lesson06/

Angsa
sumber
4

Untuk C ++ saya selalu mengingat diagram alur ini: Di skenario mana saya menggunakan wadah STL tertentu? , jadi saya ingin tahu apakah sesuatu yang serupa juga tersedia untuk Python3, tetapi saya tidak beruntung.

Yang perlu Anda ingat untuk Python adalah: Tidak ada standar Python tunggal untuk C ++. Oleh karena itu mungkin ada perbedaan besar untuk penafsir Python yang berbeda (misalnya CPython, PyPy). Diagram alur berikut adalah untuk CPython.

Selain itu saya tidak menemukan cara yang baik untuk menggabungkan struktur data berikut ke diagram: bytes, byte arrays, tuples, named_tuples, ChainMap, Counter, dan arrays.

  • OrderedDictdan dequetersedia melalui collectionsmodul.
  • heapqtersedia dari heapqmodul
  • LifoQueue,, Queuedan PriorityQueuetersedia melalui queuemodul yang dirancang untuk akses bersamaan (utas). (Ada juga yang multiprocessing.Queuetersedia tetapi saya tidak tahu perbedaannya queue.Queuetetapi akan menganggap bahwa itu harus digunakan ketika akses bersamaan dari proses diperlukan.)
  • dict, set, frozen_set, Dan listyang builtin tentu saja

Bagi siapa pun saya akan berterima kasih jika Anda dapat meningkatkan jawaban ini dan memberikan diagram yang lebih baik di setiap aspek. Merasa bebas dan selamat datang. diagram alir

PS: diagram sudah dibuat dengan yed. File graphml ada di sini

matematika
sumber
3

Dalam kombinasi dengan daftar , dikt dan set , ada juga objek python lain yang menarik, OrderedDicts .

Kamus yang dipesan sama seperti kamus biasa tetapi mereka ingat urutan item dimasukkan. Ketika mengulangi kamus yang dipesan, item dikembalikan sesuai urutan kunci mereka pertama kali ditambahkan.

OrderedDicts bisa berguna ketika Anda perlu mempertahankan urutan kunci, misalnya bekerja dengan dokumen: Biasanya diperlukan representasi vektor dari semua istilah dalam dokumen. Jadi menggunakan OrderedDicts Anda dapat memverifikasi secara efisien jika suatu istilah telah dibaca sebelumnya, menambahkan istilah, mengekstrak istilah, dan setelah semua manipulasi Anda dapat mengekstraksi representasi vektor yang diurutkan dari mereka.

Federico Caccia
sumber
1

Daftar adalah apa yang tampak - daftar nilai. Masing-masing dari mereka diberi nomor, mulai dari nol - yang pertama diberi nomor nol, yang pertama 1, yang kedua 2, dll. Anda dapat menghapus nilai dari daftar, dan menambahkan nilai baru ke akhir. Contoh: Banyak nama kucing Anda.

Tuples seperti daftar, tetapi Anda tidak dapat mengubah nilainya. Nilai-nilai yang Anda berikan pertama, adalah nilai-nilai yang Anda terjebak dengan untuk sisa program. Sekali lagi, setiap nilai diberi nomor mulai dari nol, untuk referensi yang mudah. Contoh: nama-nama bulan dalam setahun.

Kamus mirip dengan yang disarankan namanya - kamus. Dalam kamus, Anda memiliki 'indeks' kata-kata, dan untuk masing-masing definisi. Dalam python, kata tersebut disebut 'kunci', dan definisi adalah 'nilai'. Nilai-nilai dalam kamus tidak bernomor - mirip dengan apa yang namanya - kamus. Dalam kamus, Anda memiliki 'indeks' kata-kata, dan untuk masing-masing definisi. Dalam python, kata tersebut disebut 'kunci', dan definisi adalah 'nilai'. Nilai-nilai dalam kamus tidak diberi nomor - mereka tidak dalam urutan tertentu, baik - kunci melakukan hal yang sama. Anda dapat menambah, menghapus, dan mengubah nilai-nilai dalam kamus. Contoh: buku telepon.

Nitish Kumar Pal
sumber
1

Saat menggunakannya, saya membuat cheatsheet lengkap dari metode mereka untuk referensi Anda:

class ContainerMethods:
    def __init__(self):
        self.list_methods_11 = {
                    'Add':{'append','extend','insert'},
                    'Subtract':{'pop','remove'},
                    'Sort':{'reverse', 'sort'},
                    'Search':{'count', 'index'},
                    'Entire':{'clear','copy'},
                            }
        self.tuple_methods_2 = {'Search':'count','index'}

        self.dict_methods_11 = {
                    'Views':{'keys', 'values', 'items'},
                    'Add':{'update'},
                    'Subtract':{'pop', 'popitem',},
                    'Extract':{'get','setdefault',},
                    'Entire':{ 'clear', 'copy','fromkeys'},
                            }
        self.set_methods_17 ={
                    'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
                    'Subtract':{'pop', 'remove','discard'},
                    'Relation':{'isdisjoint', 'issubset', 'issuperset'},
                    'operation':{'union' 'intersection','difference', 'symmetric_difference'}
                    'Entire':{'clear', 'copy'}}
Kalkulus
sumber
1

Kamus: Kamus python digunakan seperti tabel hash dengan kunci sebagai indeks dan objek sebagai nilai.

Daftar: Daftar digunakan untuk menyimpan objek dalam array yang diindeks oleh posisi objek dalam array.

Set: Set adalah kumpulan dengan fungsi yang dapat mengetahui apakah suatu objek ada atau tidak ada dalam set.

Srinivas P
sumber