Struktur data adalah konstruksi dasar di mana Anda membangun program Anda. Setiap struktur data menyediakan cara tertentu untuk mengatur data sehingga dapat diakses secara efisien, bergantung pada kasus penggunaan Anda. Python dikirimkan dengan kumpulan struktur data yang ekstensif di perpustakaan standarnya Show
Namun, konvensi penamaan Python tidak memberikan tingkat kejelasan yang sama seperti yang Anda temukan di bahasa lain. Di Jawa, daftar bukan hanya 6—melainkan 7 atau 8. Tidak demikian halnya dengan Python. Bahkan pengembang Python berpengalaman terkadang bertanya-tanya apakah tipe 6 bawaan diimplementasikan sebagai daftar tertaut atau larik dinamisDalam tutorial ini, Anda akan belajar
Catatan. Tutorial ini diadaptasi dari bab “Common Data Structures in Python” di Python Tricks. Buku. Jika Anda menikmati apa yang Anda baca di bawah ini, maka pastikan untuk memeriksa sisa buku ini Download Gratis. Dapatkan contoh bab dari Trik Python. Buku yang menunjukkan kepada Anda praktik terbaik Python dengan contoh sederhana yang dapat Anda terapkan secara instan untuk menulis kode + Pythonic yang lebih indah Kamus, Peta, dan Tabel HashDalam Python, kamus (atau singkatnya dikte) adalah struktur data pusat. Dicts menyimpan sejumlah objek yang berubah-ubah, masing-masing diidentifikasi dengan kunci kamus yang unik Kamus juga sering disebut peta, peta hash, tabel pencarian, atau array asosiatif. Mereka memungkinkan pencarian, penyisipan, dan penghapusan objek apa pun yang terkait dengan kunci yang diberikan secara efisien Buku telepon membuat analog dunia nyata yang layak untuk objek kamus. Mereka memungkinkan Anda dengan cepat mengambil informasi (nomor telepon) yang terkait dengan kunci yang diberikan (nama seseorang). Alih-alih harus membaca buku telepon dari depan ke belakang untuk menemukan nomor seseorang, Anda dapat melompat kurang lebih langsung ke nama dan mencari informasi terkait Analogi ini agak rusak dalam hal bagaimana informasi diatur untuk memungkinkan pencarian cepat. Tetapi karakteristik kinerja fundamental tetap berlaku. Kamus memungkinkan Anda menemukan informasi yang terkait dengan kunci tertentu dengan cepat Kamus adalah salah satu struktur data yang paling penting dan sering digunakan dalam ilmu komputer. Jadi, bagaimana cara Python menangani kamus? Hilangkan iklan>>> from types import MappingProxyType >>> writable = {"one": 1, "two": 2} >>> read_only = MappingProxyType(writable) >>> # The proxy is read-only: >>> read_only["one"] 1 >>> read_only["one"] = 23 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'mappingproxy' object does not support item assignment >>> # Updates to the original are reflected in the proxy: >>> writable["one"] = 42 >>> read_only mappingproxy({'one': 42, 'two': 2}) _0. Kamus Masuk AndaKarena kamus sangat penting, Python menampilkan implementasi kamus yang kuat yang dibangun langsung ke dalam bahasa inti. tipe data Python juga menyediakan beberapa gula sintaksis yang berguna untuk bekerja dengan kamus di program Anda. Misalnya, sintaks ekspresi kamus kurung kurawal ({ }) dan memungkinkan Anda untuk dengan mudah menentukan objek kamus baru >>> _Ada beberapa batasan pada objek mana yang dapat digunakan sebagai kunci yang valid Kamus Python diindeks oleh kunci yang bisa dari jenis apa pun. Objek hashable memiliki nilai hash yang tidak pernah berubah selama hidupnya (lihat 2), dan dapat dibandingkan dengan objek lain (lihat 3). Objek hashable yang membandingkan sama harus memiliki nilai hash yang samaJenis yang tidak dapat diubah seperti string dan angka dapat di-hash dan berfungsi dengan baik sebagai kunci kamus. Anda juga dapat menggunakan sebagai kunci kamus asalkan hanya berisi tipe hashable itu sendiri Untuk sebagian besar kasus penggunaan, implementasi kamus bawaan Python akan melakukan semua yang Anda butuhkan. Kamus sangat dioptimalkan dan mendasari banyak bagian bahasa. Misalnya, dan variabel dalam keduanya disimpan secara internal dalam kamus Kamus Python didasarkan pada implementasi tabel hash yang teruji dengan baik dan disetel dengan baik yang memberikan karakteristik kinerja yang Anda harapkan. O(1) kompleksitas waktu untuk operasi pencarian, penyisipan, pembaruan, dan penghapusan dalam kasus rata-rata Ada sedikit alasan untuk tidak menggunakan implementasi standar _0 yang disertakan dengan Python. Namun, ada implementasi kamus pihak ketiga khusus, seperti daftar lewati atau kamus berbasis B-treeSelain objek _0 biasa, pustaka standar Python juga menyertakan sejumlah implementasi kamus khusus. Kamus khusus ini semuanya didasarkan pada kelas kamus bawaan (dan berbagi karakteristik kinerjanya), tetapi juga menyertakan beberapa fitur kenyamanan tambahanMari kita lihat mereka >>> from types import MappingProxyType >>> writable = {"one": 1, "two": 2} >>> read_only = MappingProxyType(writable) >>> # The proxy is read-only: >>> read_only["one"] 1 >>> read_only["one"] = 23 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'mappingproxy' object does not support item assignment >>> # Updates to the original are reflected in the proxy: >>> writable["one"] = 42 >>> read_only mappingproxy({'one': 42, 'two': 2}) _7. Ingat Urutan Penyisipan KunciPython menyertakan subkelas 0 khusus yang mengingat urutan penyisipan kunci yang ditambahkan ke dalamnya. _7Catatan. 0 bukan bagian bawaan dari bahasa inti dan harus diimpor dari modul 1 di perpustakaan standarSementara standar 0 instance mempertahankan urutan penyisipan kunci di Python 3. 6 ke atas, ini hanyalah efek samping dari implementasi CPython dan tidak ditentukan dalam spesifikasi bahasa hingga Python 3. 7. Jadi, jika urutan kunci penting agar algoritme Anda berfungsi, sebaiknya komunikasikan ini secara jelas dengan menggunakan kelas 0 secara eksplisit>>> _Sampai Python 3. 8, Anda tidak dapat mengulangi item kamus dalam urutan terbalik menggunakan 4. Hanya _0 instans yang menawarkan fungsionalitas tersebut. Bahkan di Python 3. 8, 0 dan 0 objek tidak persis sama. 0 instans memiliki metode 9 yang tidak tersedia pada instans 0 biasa, serta lebih dapat disesuaikan daripada instans 0 biasa>>> arr = ("one", "two", "three") >>> arr[0] 'one' >>> # Tuples have a nice repr: >>> arr ('one', 'two', 'three') >>> # Tuples are immutable: >>> arr[1] = "hello" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> del arr[1] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object doesn't support item deletion >>> # Tuples can hold arbitrary data types: >>> # (Adding elements creates a copy of the tuple) >>> arr + (23,) ('one', 'two', 'three', 23) 3. Mengembalikan Nilai Default untuk Kunci yang HilangKelas adalah subkelas kamus lain yang menerima panggilan dalam konstruktornya yang nilai pengembaliannya akan digunakan jika kunci yang diminta tidak dapat ditemukan Ini dapat menghemat beberapa pengetikan dan membuat niat Anda lebih jelas dibandingkan dengan menggunakan 5 atau menangkap pengecualian 6 dalam kamus biasa>>> _Hilangkan iklan>>> arr = ("one", "two", "three") >>> arr[0] 'one' >>> # Tuples have a nice repr: >>> arr ('one', 'two', 'three') >>> # Tuples are immutable: >>> arr[1] = "hello" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> del arr[1] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object doesn't support item deletion >>> # Tuples can hold arbitrary data types: >>> # (Adding elements creates a copy of the tuple) >>> arr + (23,) ('one', 'two', 'three', 23) 7. Cari Beberapa Kamus sebagai Pemetaan TunggalStruktur data mengelompokkan beberapa kamus ke dalam satu pemetaan. Pencarian mencari pemetaan yang mendasarinya satu per satu hingga kunci ditemukan. Penyisipan, pembaruan, dan penghapusan hanya memengaruhi pemetaan pertama yang ditambahkan ke rantai >>> ________0______ >>> arr = ("one", "two", "three") >>> arr[0] 'one' >>> # Tuples have a nice repr: >>> arr ('one', 'two', 'three') >>> # Tuples are immutable: >>> arr[1] = "hello" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> del arr[1] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object doesn't support item deletion >>> # Tuples can hold arbitrary data types: >>> # (Adding elements creates a copy of the tuple) >>> arr + (23,) ('one', 'two', 'three', 23) _9. Pembungkus untuk Membuat Kamus Hanya-Bacaadalah pembungkus di sekitar kamus standar yang menyediakan tampilan hanya-baca ke dalam data kamus yang dibungkus. Kelas ini ditambahkan dalam Python 3. 3 dan dapat digunakan untuk membuat kamus versi proksi yang tidak dapat diubah 0 dapat membantu jika, misalnya, Anda ingin mengembalikan kamus yang membawa status internal dari kelas atau modul sambil mencegah akses tulis ke objek ini. Menggunakan _0 memungkinkan Anda menerapkan batasan ini tanpa terlebih dahulu harus membuat salinan lengkap kamus>>> _Kamus dengan Python. RingkasanSemua implementasi kamus Python yang tercantum dalam tutorial ini adalah implementasi valid yang dibangun ke dalam pustaka standar Python Jika Anda sedang mencari rekomendasi umum tentang tipe pemetaan mana yang akan digunakan dalam program Anda, saya akan mengarahkan Anda ke tipe data 0 bawaan. Ini adalah penerapan tabel hash yang serbaguna dan dioptimalkan yang dibangun langsung ke dalam bahasa intiSaya akan merekomendasikan agar Anda menggunakan salah satu jenis data lain yang tercantum di sini hanya jika Anda memiliki persyaratan khusus yang melampaui apa yang disediakan oleh 0Semua implementasi adalah opsi yang valid, tetapi kode Anda akan lebih jelas dan lebih mudah dipelihara jika sebagian besar bergantung pada kamus Python standar Struktur Data ArrayArray adalah struktur data fundamental yang tersedia di sebagian besar bahasa pemrograman, dan memiliki banyak kegunaan di berbagai algoritma Di bagian ini, Anda akan melihat implementasi larik di Python yang hanya menggunakan fitur atau fungsionalitas bahasa inti yang disertakan dalam pustaka standar Python. Anda akan melihat kekuatan dan kelemahan dari setiap pendekatan sehingga Anda dapat memutuskan penerapan mana yang tepat untuk kasus penggunaan Anda Tapi sebelum kita masuk, mari kita bahas beberapa dasar terlebih dahulu. Bagaimana cara kerja array, dan untuk apa mereka digunakan? Karena array menyimpan informasi dalam blok memori yang bersebelahan, mereka dianggap sebagai struktur data yang bersebelahan (berlawanan dengan struktur data tertaut seperti daftar tertaut, misalnya) Analogi dunia nyata untuk struktur data array adalah tempat parkir. Anda dapat melihat tempat parkir secara keseluruhan dan memperlakukannya sebagai satu objek, tetapi di dalam tempat parkir terdapat tempat parkir yang diindeks dengan nomor unik. Tempat parkir adalah wadah untuk kendaraan — setiap tempat parkir bisa kosong atau ada mobil, sepeda motor, atau kendaraan lain yang diparkir di atasnya Tapi tidak semua tempat parkir sama. Beberapa tempat parkir mungkin dibatasi hanya untuk satu jenis kendaraan. Misalnya, tempat parkir rumah motor tidak mengizinkan sepeda diparkir di atasnya. Tempat parkir terbatas sesuai dengan struktur data array yang diketik yang memungkinkan hanya elemen yang memiliki tipe data yang sama disimpan di dalamnya Dari segi kinerja, sangat cepat untuk mencari elemen yang terkandung dalam larik yang diberi indeks elemen. Implementasi array yang tepat menjamin waktu akses O(1) yang konstan untuk kasus ini Python menyertakan beberapa struktur data mirip-array di perpustakaan standarnya yang masing-masing memiliki karakteristik yang sedikit berbeda. Mari lihat Hilangkan iklan>>> from collections import ChainMap >>> dict1 = {"one": 1, "two": 2} >>> dict2 = {"three": 3, "four": 4} >>> chain = ChainMap(dict1, dict2) >>> chain ChainMap({'one': 1, 'two': 2}, {'three': 3, 'four': 4}) >>> # ChainMap searches each collection in the chain >>> # from left to right until it finds the key (or fails): >>> chain["three"] 3 >>> chain["one"] 1 >>> chain["missing"] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'missing' _6. Array Dinamis yang Dapat Diubahadalah bagian dari inti bahasa Python. Terlepas dari namanya, daftar Python diimplementasikan sebagai array dinamis di belakang layar Ini berarti daftar memungkinkan elemen ditambahkan atau dihapus, dan daftar akan secara otomatis menyesuaikan backing store yang menyimpan elemen-elemen ini dengan mengalokasikan atau melepaskan memori. Daftar Python dapat menampung elemen arbitrer — semuanya adalah objek dalam Python, termasuk fungsi. Oleh karena itu, Anda dapat mencampur dan mencocokkan berbagai jenis tipe data dan menyimpan semuanya dalam satu daftar Ini bisa menjadi fitur yang hebat, tetapi sisi negatifnya adalah mendukung banyak tipe data pada saat yang sama berarti bahwa data umumnya kurang padat. Akibatnya, seluruh struktur memakan lebih banyak ruang >>> _>>> from types import MappingProxyType >>> writable = {"one": 1, "two": 2} >>> read_only = MappingProxyType(writable) >>> # The proxy is read-only: >>> read_only["one"] 1 >>> read_only["one"] = 23 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'mappingproxy' object does not support item assignment >>> # Updates to the original are reflected in the proxy: >>> writable["one"] = 42 >>> read_only mappingproxy({'one': 42, 'two': 2}) _4. Kontainer yang tidak dapat diubahSama seperti daftar, merupakan bagian dari bahasa inti Python. Tidak seperti daftar, objek 4 Python tidak dapat diubah. Ini berarti elemen tidak dapat ditambahkan atau dihapus secara dinamis—semua elemen dalam tuple harus ditentukan pada waktu pembuatanTuple adalah struktur data lain yang dapat menampung elemen tipe data arbitrer. Memiliki fleksibilitas ini sangat kuat, tetapi sekali lagi, ini juga berarti bahwa data tidak terlalu padat dibandingkan dengan array yang diketik >>> _>>> import array >>> arr = array.array("f", (1.0, 1.5, 2.0, 2.5)) >>> arr[1] 1.5 >>> # Arrays have a nice repr: >>> arr array('f', [1.0, 1.5, 2.0, 2.5]) >>> # Arrays are mutable: >>> arr[1] = 23.0 >>> arr array('f', [1.0, 23.0, 2.0, 2.5]) >>> del arr[1] >>> arr array('f', [1.0, 2.0, 2.5]) >>> arr.append(42.0) >>> arr array('f', [1.0, 2.0, 2.5, 42.0]) >>> # Arrays are "typed": >>> arr[1] = "hello" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be real number, not str _8. Array Berketik DasarModul 9 Python menyediakan penyimpanan hemat ruang untuk tipe data dasar gaya-C seperti byte, bilangan bulat 32-bit, angka floating-point, dan sebagainyaArray yang dibuat dengan kelas _8 dapat berubah dan berperilaku mirip dengan daftar kecuali satu perbedaan penting. mereka diketik array yang dibatasi untuk satu tipe dataKarena kendala ini, _8 objek dengan banyak elemen lebih hemat ruang daripada daftar dan tupel. Elemen yang disimpan di dalamnya dikemas rapat, dan ini berguna jika Anda perlu menyimpan banyak elemen dengan jenis yang samaSelain itu, array mendukung banyak metode yang sama seperti daftar reguler, dan Anda mungkin dapat menggunakannya sebagai pengganti drop-in tanpa memerlukan perubahan lain pada kode aplikasi Anda >>> _>>> arr = "abcd" >>> arr[1] 'b' >>> arr 'abcd' >>> # Strings are immutable: >>> arr[1] = "e" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment >>> del arr[1] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object doesn't support item deletion >>> # Strings can be unpacked into a list to >>> # get a mutable representation: >>> list("abcd") ['a', 'b', 'c', 'd'] >>> "".join(list("abcd")) 'abcd' >>> # Strings are recursive data structures: >>> type("abc") "<class 'str'>" >>> type("abc"[0]) "<class 'str'>" _2. Array Karakter Unicode yang Tidak Dapat DiubahPiton 3. x menggunakan objek untuk menyimpan data tekstual sebagai rangkaian karakter Unicode yang tidak dapat diubah. Secara praktis, itu berarti 2 adalah susunan karakter yang tidak dapat diubah. Anehnya, ini juga merupakan struktur data rekursif—setiap karakter dalam string itu sendiri adalah objek 2 dengan panjang 1Objek string hemat ruang karena dikemas dengan rapat dan berspesialisasi dalam satu tipe data. Jika Anda menyimpan teks Unicode, maka Anda harus menggunakan string Karena string tidak dapat diubah dalam Python, memodifikasi string memerlukan pembuatan salinan yang dimodifikasi. Setara terdekat dengan string yang bisa berubah adalah menyimpan karakter individual di dalam daftar >>> _Hilangkan iklan>>> arr = "abcd" >>> arr[1] 'b' >>> arr 'abcd' >>> # Strings are immutable: >>> arr[1] = "e" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment >>> del arr[1] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object doesn't support item deletion >>> # Strings can be unpacked into a list to >>> # get a mutable representation: >>> list("abcd") ['a', 'b', 'c', 'd'] >>> "".join(list("abcd")) 'abcd' >>> # Strings are recursive data structures: >>> type("abc") "<class 'str'>" >>> type("abc"[0]) "<class 'str'>" _6. Array Byte Tunggal yang Tidak Dapat Diubahobjek adalah urutan byte tunggal yang tidak dapat diubah, atau bilangan bulat dalam rentang 0 ≤ x ≤ 255. Secara konseptual, objek 6 mirip dengan objek 2, dan Anda juga dapat menganggapnya sebagai array byte yang tidak dapat diubahSeperti string, 6 memiliki sintaks literalnya sendiri untuk membuat objek dan hemat ruang. 6 objek tidak dapat diubah, tetapi tidak seperti string, ada tipe data array byte khusus yang dapat diubah yang disebut 2 yang dapat dibongkar>>> _>>> arr = bytes((0, 1, 2, 3)) >>> arr[1] 1 >>> # Bytes literals have their own syntax: >>> arr b'\x00\x01\x02\x03' >>> arr = b"\x00\x01\x02\x03" >>> # Only valid `bytes` are allowed: >>> bytes((0, 300)) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: bytes must be in range(0, 256) >>> # Bytes are immutable: >>> arr[1] = 23 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'bytes' object does not support item assignment >>> del arr[1] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'bytes' object doesn't support item deletion _2. Array yang Dapat Diubah dari Single ByteJenisnya adalah urutan bilangan bulat yang bisa berubah dalam rentang 0 ≤ x ≤ 255. Objek _2 terkait erat dengan objek 6, dengan perbedaan utama adalah bahwa 2 dapat dimodifikasi secara bebas—Anda dapat menimpa elemen, menghapus elemen yang ada, atau menambahkan yang baru. Objek _2 akan tumbuh dan menyusutA _2 dapat diubah kembali menjadi objek 6 yang tidak dapat diubah, tetapi ini melibatkan penyalinan data yang disimpan secara penuh—operasi lambat yang memakan waktu O(n) waktu>>> 0Array dengan Python. RingkasanAda sejumlah struktur data bawaan yang dapat Anda pilih untuk mengimplementasikan array dengan Python. Di bagian ini, Anda berfokus pada fitur bahasa inti dan struktur data yang disertakan dalam pustaka standar Jika Anda ingin melampaui pustaka standar Python, maka paket pihak ketiga seperti NumPy dan panda menawarkan berbagai implementasi larik cepat untuk komputasi ilmiah dan ilmu data Jika Anda ingin membatasi diri Anda pada struktur data array yang disertakan dengan Python, berikut beberapa panduannya
Dalam kebanyakan kasus, saya suka memulai dengan 6 sederhana. Saya hanya akan mengkhususkan nanti jika kinerja atau ruang penyimpanan menjadi masalah. Sebagian besar waktu, menggunakan struktur data array tujuan umum seperti 6 memberi Anda kecepatan pengembangan tercepat dan kenyamanan pemrograman terbanyakSaya telah menemukan bahwa ini biasanya jauh lebih penting di awal daripada mencoba memeras setiap penurunan kinerja sejak awal Rekaman, Struktur, dan Objek Transfer DataDibandingkan dengan array, struktur data rekaman menyediakan jumlah bidang yang tetap. Setiap bidang dapat memiliki nama dan mungkin juga memiliki jenis yang berbeda Di bagian ini, Anda akan melihat cara mengimplementasikan record, struct, dan objek data lama biasa di Python hanya menggunakan tipe data dan class bawaan dari library standar Catatan. Saya menggunakan definisi catatan secara longgar di sini. Sebagai contoh, saya juga akan membahas jenis seperti 4 built-in Python yang mungkin atau mungkin tidak dianggap catatan dalam arti ketat karena mereka tidak menyediakan bidang bernamaPython menawarkan beberapa tipe data yang dapat Anda gunakan untuk mengimplementasikan record, struct, dan objek transfer data. Di bagian ini, Anda akan melihat sekilas setiap penerapan dan karakteristik uniknya. Pada akhirnya, Anda akan menemukan ringkasan dan panduan pengambilan keputusan yang akan membantu Anda membuat pilihan sendiri Catatan. Tutorial ini diadaptasi dari bab “Common Data Structures in Python” di Python Tricks. Buku. Jika Anda menikmati apa yang Anda baca, maka pastikan untuk memeriksa sisa buku ini Baiklah, mari kita mulai Hilangkan iklan>>> from types import MappingProxyType >>> writable = {"one": 1, "two": 2} >>> read_only = MappingProxyType(writable) >>> # The proxy is read-only: >>> read_only["one"] 1 >>> read_only["one"] = 23 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'mappingproxy' object does not support item assignment >>> # Updates to the original are reflected in the proxy: >>> writable["one"] = 42 >>> read_only mappingproxy({'one': 42, 'two': 2}) _0. Objek Data SederhanaSeperti disebutkan , kamus Python menyimpan sejumlah objek yang berubah-ubah, masing-masing diidentifikasi dengan kunci unik. Kamus juga sering disebut peta atau larik asosiatif dan memungkinkan pencarian, penyisipan, dan penghapusan objek apa pun yang terkait dengan kunci yang diberikan secara efisien Menggunakan kamus sebagai tipe data rekaman atau objek data dengan Python dimungkinkan. Kamus mudah dibuat dengan Python karena mereka memiliki gula sintaksis sendiri yang dibangun ke dalam bahasa dalam bentuk literal kamus. Sintaks kamusnya ringkas dan cukup nyaman untuk diketik Objek data yang dibuat menggunakan kamus dapat berubah, dan ada sedikit perlindungan terhadap nama bidang yang salah eja karena bidang dapat ditambahkan dan dihapus secara bebas kapan saja. Kedua properti ini dapat menimbulkan bug yang mengejutkan, dan selalu ada trade-off yang harus dilakukan antara kenyamanan dan ketahanan kesalahan >>> 1>>> from types import MappingProxyType >>> writable = {"one": 1, "two": 2} >>> read_only = MappingProxyType(writable) >>> # The proxy is read-only: >>> read_only["one"] 1 >>> read_only["one"] = 23 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'mappingproxy' object does not support item assignment >>> # Updates to the original are reflected in the proxy: >>> writable["one"] = 42 >>> read_only mappingproxy({'one': 42, 'two': 2}) _4. Grup Objek yang Tidak Dapat DiubahTupel Python adalah struktur data langsung untuk mengelompokkan objek arbitrer. Tuple tidak dapat diubah—mereka tidak dapat dimodifikasi setelah dibuat Dari segi kinerja, tupel membutuhkan lebih dari , dan mereka juga lebih cepat dibuat Seperti yang Anda lihat dalam pembongkaran bytecode di bawah ini, membangun konstanta tuple membutuhkan opcode 13 tunggal, sementara membangun objek daftar dengan konten yang sama memerlukan beberapa operasi lagi>>> 2Namun, Anda tidak boleh terlalu menekankan perbedaan ini. Dalam praktiknya, perbedaan kinerja seringkali dapat diabaikan, dan mencoba memeras kinerja ekstra dari suatu program dengan beralih dari daftar ke tupel kemungkinan akan menjadi pendekatan yang salah. Kelemahan potensial dari tupel biasa adalah bahwa data yang Anda simpan di dalamnya hanya dapat ditarik keluar dengan mengaksesnya melalui indeks bilangan bulat. Anda tidak dapat memberi nama pada properti individual yang disimpan dalam tuple. Ini dapat memengaruhi keterbacaan kode Juga, tuple selalu merupakan struktur ad-hoc. sulit untuk memastikan bahwa dua tupel memiliki jumlah bidang yang sama dan properti yang sama disimpan di dalamnya Hal ini memudahkan untuk memperkenalkan bug slip-of-the-mind, seperti mencampuradukkan urutan bidang. Oleh karena itu, saya akan merekomendasikan agar Anda menyimpan jumlah bidang yang disimpan dalam tupel serendah mungkin >>> 3Tulis Kelas Khusus. Lebih Banyak Pekerjaan, Lebih Banyak KontrolKelas memungkinkan Anda menentukan cetak biru yang dapat digunakan kembali untuk objek data guna memastikan setiap objek menyediakan kumpulan bidang yang sama Menggunakan kelas Python reguler sebagai tipe data rekaman dapat dilakukan, tetapi juga membutuhkan kerja manual untuk mendapatkan fitur kenyamanan dari implementasi lainnya. Misalnya, menambahkan bidang baru ke konstruktor _14 bersifat verbose dan membutuhkan waktuSelain itu, representasi string default untuk objek yang dibuat dari kelas khusus tidak terlalu membantu. Untuk memperbaikinya, Anda mungkin harus menambahkan metode Anda sendiri, yang sekali lagi biasanya cukup bertele-tele dan harus diperbarui setiap kali Anda menambahkan bidang baru Bidang yang disimpan di kelas dapat berubah, dan bidang baru dapat ditambahkan secara bebas, yang mungkin Anda sukai atau tidak. Dimungkinkan untuk memberikan lebih banyak kontrol akses dan membuat bidang hanya-baca menggunakan dekorator, tetapi sekali lagi, ini memerlukan penulisan lebih banyak kode lem Menulis kelas khusus adalah opsi yang bagus kapan pun Anda ingin menambahkan logika dan perilaku bisnis ke objek rekaman Anda menggunakan metode. Namun, ini berarti bahwa objek ini secara teknis bukan lagi objek data biasa >>> 4Hilangkan iklan>>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _17. Piton 3. 7+ Kelas DataKelas data tersedia di Python 3. 7 dan di atas. Mereka memberikan alternatif yang sangat baik untuk menentukan kelas penyimpanan data Anda sendiri dari awal Dengan menulis kelas data alih-alih kelas Python biasa, instance objek Anda mendapatkan beberapa fitur berguna di luar kotak yang akan menghemat beberapa pengetikan dan pekerjaan implementasi manual
Kelas data biasanya dibuat menggunakan dekorator 20, seperti yang akan Anda lihat pada contoh kode di bawah ini>>> 5Untuk mempelajari lebih lanjut tentang kelas data Python, lihat Panduan Utama untuk Kelas Data di Python 3. 7 >>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _21. Objek Data NyamanKelas _22 tersedia di Python 2. 6+ menyediakan ekstensi dari tipe data 4 bawaan. Mirip dengan mendefinisikan kelas khusus, menggunakan 22 memungkinkan Anda menentukan cetak biru yang dapat digunakan kembali untuk catatan Anda yang memastikan nama bidang yang benar digunakan 22 objek tidak dapat diubah, seperti tupel biasa. Ini berarti Anda tidak dapat menambahkan kolom baru atau mengubah kolom yang ada setelah instance 22 dibuatSelain itu, _22 objek juga. . . tupel bernama. Setiap objek yang disimpan di dalamnya dapat diakses melalui pengidentifikasi unik. Ini membebaskan Anda dari keharusan mengingat indeks bilangan bulat atau menggunakan solusi seperti mendefinisikan konstanta bilangan bulat sebagai mnemonik untuk indeks Anda 22 objek diimplementasikan sebagai kelas Python biasa secara internal. Dalam hal penggunaan memori, mereka juga lebih baik daripada kelas biasa dan sama efisiennya dengan memori seperti tupel biasa>>> 6 22 objek dapat menjadi cara mudah untuk membersihkan kode Anda dan membuatnya lebih mudah dibaca dengan menerapkan struktur yang lebih baik untuk data AndaSaya menemukan bahwa beralih dari tipe data ad-hoc seperti kamus dengan format tetap ke objek 22 membantu saya mengekspresikan maksud kode saya dengan lebih jelas. Seringkali ketika saya menerapkan refactoring ini, saya secara ajaib menemukan solusi yang lebih baik untuk masalah yang saya hadapiMenggunakan _22 objek di atas tupel dan dikte biasa (tidak terstruktur) juga dapat membuat hidup rekan kerja Anda lebih mudah dengan membuat data yang diteruskan mendokumentasikan diri, setidaknya sampai taraf tertentu>>> 7>>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _32. Namedtuple yang ditingkatkanDitambahkan dalam Python 3. 6, adalah adik dari kelas 22 di modul 1. Ini sangat mirip dengan _22, dengan perbedaan utama adalah sintaks yang diperbarui untuk menentukan jenis catatan baru dan menambahkan dukungan untuk petunjuk jenisHarap diperhatikan bahwa anotasi jenis tidak diterapkan tanpa alat pemeriksa jenis terpisah seperti mypy. Tetapi bahkan tanpa dukungan alat, mereka dapat memberikan petunjuk yang berguna untuk pemrogram lain (atau sangat membingungkan jika petunjuk jenisnya sudah ketinggalan zaman) >>> 8Hilangkan iklan>>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _37. Struktur C berseriKelas mengonversi antara nilai Python dan struct C yang diserialisasi menjadi objek Python 6. Misalnya, dapat digunakan untuk menangani data biner yang disimpan dalam file atau masuk dari koneksi jaringanStruktur didefinisikan menggunakan bahasa mini berdasarkan yang memungkinkan Anda untuk menentukan pengaturan berbagai tipe data C seperti 40, 41, dan 42 serta varian 43 merekaStruk berseri jarang digunakan untuk merepresentasikan objek data yang dimaksudkan untuk ditangani murni di dalam kode Python. Mereka dimaksudkan terutama sebagai format pertukaran data daripada sebagai cara menyimpan data dalam memori yang hanya digunakan oleh kode Python Dalam beberapa kasus, mengemas data primitif ke dalam struct mungkin menggunakan lebih sedikit memori daripada menyimpannya di tipe data lain. Namun, dalam kebanyakan kasus itu akan menjadi pengoptimalan yang cukup maju (dan mungkin tidak perlu). >>> 9>>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _44. Akses Atribut MewahInilah satu lagi pilihan yang sedikit tidak jelas untuk mengimplementasikan objek data dengan Python. . Kelas ini ditambahkan dalam Python 3. 3 dan memberikan akses atribut ke namespace-nya Ini berarti _46 contoh mengekspos semua kunci mereka sebagai atribut kelas. Anda dapat menggunakan 47 akses atribut bertitik alih-alih 48 sintaks pengindeksan kurung siku yang digunakan oleh dikt biasa. Semua contoh juga menyertakan _15 yang bermakna secara defaultSeperti namanya, 46 sederhana. Ini pada dasarnya adalah kamus yang memungkinkan akses atribut dan mencetak dengan baik. Atribut dapat ditambahkan, dimodifikasi, dan dihapus dengan bebas>>> 0Catatan, Struktur, dan Objek Data dengan Python. RingkasanSeperti yang telah Anda lihat, ada cukup banyak opsi berbeda untuk mengimplementasikan rekaman atau objek data. Jenis apa yang harus Anda gunakan untuk objek data di Python?
Jika Anda mencari pilihan default yang aman, maka rekomendasi umum saya untuk mengimplementasikan record biasa, struct, atau objek data di Python adalah menggunakan 21 di Python 2. x dan adiknya, 32 dengan Python 3Set dan MultisetDi bagian ini, Anda akan melihat cara mengimplementasikan struktur data set dan multiset (bag) yang dapat berubah dan tidak dapat diubah di Python menggunakan tipe dan kelas data bawaan dari pustaka standar Set adalah kumpulan objek yang tidak terurut yang tidak memungkinkan elemen duplikat. Biasanya, himpunan digunakan untuk dengan cepat menguji nilai keanggotaan dalam himpunan, untuk menyisipkan atau menghapus nilai baru dari himpunan, dan untuk menghitung penyatuan atau perpotongan dua himpunan. Dalam implementasi set yang tepat, pengujian keanggotaan diharapkan berjalan dalam waktu O(1) yang cepat. Operasi penyatuan, persimpangan, perbedaan, dan subset harus memakan waktu rata-rata O(n). Implementasi set yang termasuk dalam pustaka standar Python mengikuti karakteristik kinerja ini Sama seperti kamus, set mendapatkan perlakuan khusus dengan Python dan memiliki beberapa gula sintaksis yang membuatnya mudah dibuat. Misalnya, sintaks ekspresi set kurung kurawal dan memungkinkan Anda untuk dengan mudah menentukan instance set baru 1Tetapi berhati-hatilah. Untuk membuat set kosong, Anda harus memanggil konstruktor 63. Menggunakan kurung kurawal kosong ( 64) bersifat ambigu dan akan membuat kamus kosong sebagai gantinyaPython dan pustaka standarnya menyediakan beberapa set implementasi. Mari kita lihat mereka Hilangkan iklan>>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _65. Perangkat Masuk AndaJenisnya adalah implementasi set bawaan di Python. Ini bisa berubah dan memungkinkan penyisipan dan penghapusan elemen secara dinamis Set Python didukung oleh tipe data 0 dan berbagi karakteristik kinerja yang sama. Objek apa pun dapat disimpan dalam satu set>>> 2>>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _68. Set yang tidak dapat diubahKelas mengimplementasikan versi 65 yang tidak dapat diubah yang tidak dapat diubah setelah dibuat 68 objek bersifat statis dan hanya mengizinkan operasi kueri pada elemennya, bukan penyisipan atau penghapusan. Karena objek _68 bersifat statis dan hashable, mereka dapat digunakan sebagai kunci kamus atau sebagai elemen dari kumpulan lain, sesuatu yang tidak mungkin dilakukan dengan objek biasa (dapat diubah) 65>>> 3>>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _74. MultisetKelas di perpustakaan standar Python mengimplementasikan multiset, atau tas, tipe yang memungkinkan elemen di set memiliki lebih dari satu kejadian Ini berguna jika Anda perlu melacak tidak hanya jika suatu elemen adalah bagian dari kumpulan, tetapi juga berapa kali itu disertakan dalam kumpulan >>> 4Satu peringatan untuk kelas _76 adalah Anda harus berhati-hati saat menghitung jumlah elemen dalam objek 76. Memanggil _78 mengembalikan jumlah elemen unik dalam multiset, sedangkan jumlah total elemen dapat diambil menggunakan 79>>> 5Set dan Multiset dengan Python. RingkasanSet adalah struktur data lain yang berguna dan umum digunakan yang disertakan dengan Python dan pustaka standarnya. Berikut adalah beberapa panduan untuk memutuskan mana yang akan digunakan
Tumpukan (LIFO)A adalah kumpulan objek yang mendukung semantik Last-In/First-Out (LIFO) cepat untuk penyisipan dan penghapusan. Tidak seperti daftar atau larik, tumpukan biasanya tidak mengizinkan akses acak ke objek yang dikandungnya. Operasi insert dan delete juga sering disebut push and pop Analogi dunia nyata yang berguna untuk struktur data tumpukan adalah tumpukan pelat. Pelat baru ditambahkan ke bagian atas tumpukan, dan karena pelat berharga dan berat, hanya pelat paling atas yang dapat dipindahkan. Dengan kata lain, pelat terakhir pada tumpukan harus menjadi yang pertama dilepas (LIFO). Untuk mencapai pelat yang lebih rendah di tumpukan, pelat paling atas harus dilepas satu per satu Dari segi kinerja, implementasi tumpukan yang tepat diharapkan membutuhkan waktu O(1) untuk operasi penyisipan dan penghapusan Tumpukan memiliki berbagai kegunaan dalam algoritma. Misalnya, mereka digunakan dalam penguraian bahasa serta manajemen memori runtime, yang bergantung pada tumpukan panggilan. Algoritme pendek dan indah menggunakan tumpukan adalah pencarian pertama-dalam (DFS) pada pohon atau struktur data grafik Python dikirimkan dengan beberapa implementasi tumpukan yang masing-masing memiliki karakteristik yang sedikit berbeda. Mari kita lihat dan bandingkan karakteristiknya Hilangkan iklan>>> from collections import ChainMap >>> dict1 = {"one": 1, "two": 2} >>> dict2 = {"three": 3, "four": 4} >>> chain = ChainMap(dict1, dict2) >>> chain ChainMap({'one': 1, 'two': 2}, {'three': 3, 'four': 4}) >>> # ChainMap searches each collection in the chain >>> # from left to right until it finds the key (or fails): >>> chain["three"] 3 >>> chain["one"] 1 >>> chain["missing"] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'missing' _6. Sederhana, Tumpukan BawaanTipe 6 bawaan Python karena mendukung operasi push dan pop dalam waktu O(1) diamortisasiDaftar Python diimplementasikan sebagai array dinamis secara internal, yang berarti mereka terkadang perlu mengubah ukuran ruang penyimpanan untuk elemen yang disimpan di dalamnya saat elemen ditambahkan atau dihapus. Daftar tersebut mengalokasikan penyimpanan pendukungnya secara berlebihan sehingga tidak setiap push atau pop memerlukan pengubahan ukuran. Akibatnya, Anda mendapatkan kompleksitas waktu O(1) diamortisasi untuk operasi ini Sisi negatifnya adalah ini membuat kinerjanya kurang konsisten dibandingkan penyisipan dan penghapusan O(1) stabil yang disediakan oleh implementasi berbasis daftar tertaut (seperti yang akan Anda lihat di bawah dengan 85). Di sisi lain, daftar menyediakan akses acak cepat O(1) waktu ke elemen di tumpukan, dan ini bisa menjadi keuntungan tambahanAda peringatan kinerja penting yang harus Anda ketahui saat menggunakan daftar sebagai tumpukan. Untuk mendapatkan kinerja O(1) diamortisasi untuk penyisipan dan penghapusan, item baru harus ditambahkan ke akhir daftar dengan metode 86 dan dihapus lagi dari akhir menggunakan 87. Untuk kinerja optimal, tumpukan berdasarkan daftar Python harus tumbuh ke indeks yang lebih tinggi dan menyusut ke indeks yang lebih rendahMenambah dan menghapus dari depan jauh lebih lambat dan membutuhkan waktu O(n), karena elemen yang ada harus digeser untuk memberi ruang bagi elemen baru. Ini adalah antipola kinerja yang harus Anda hindari sebisa mungkin >>> 6>>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _85. Tumpukan Cepat dan KuatKelas mengimplementasikan a yang mendukung penambahan dan penghapusan elemen dari salah satu ujung dalam waktu O(1) (tidak diamortisasi). Karena deques mendukung penambahan dan penghapusan elemen dari kedua ujung dengan sama baiknya, mereka dapat berfungsi baik sebagai antrian maupun sebagai tumpukan Objek 89 Python diimplementasikan sebagai , yang memberi mereka kinerja yang sangat baik dan konsisten untuk memasukkan dan menghapus elemen tetapi kinerja O(n) yang buruk untuk mengakses elemen secara acak di tengah tumpukanSecara keseluruhan, jika Anda mencari struktur data tumpukan di pustaka standar Python yang memiliki karakteristik kinerja implementasi daftar tertaut >>> 7>>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _92. Mengunci Semantik untuk Komputasi ParalelImplementasi tumpukan di pustaka standar Python disinkronkan dan menyediakan semantik penguncian untuk mendukung banyak produsen dan konsumen secara bersamaan Selain _93, modul 95 berisi beberapa kelas lain yang menerapkan antrian multi-produsen, multi-konsumen yang berguna untuk komputasi paralelBergantung pada kasus penggunaan Anda, semantik penguncian mungkin berguna, atau mungkin menimbulkan biaya tambahan yang tidak dibutuhkan. Dalam hal ini, Anda akan lebih baik menggunakan 6 atau 89 sebagai tumpukan tujuan umum>>> ________29______8 Implementasi Stack dengan Python. RingkasanSeperti yang Anda lihat, Python dikirimkan dengan beberapa implementasi untuk struktur data tumpukan. Semuanya memiliki karakteristik yang sedikit berbeda serta pertukaran kinerja dan penggunaan Jika Anda tidak mencari dukungan pemrosesan paralel (atau jika Anda tidak ingin menangani penguncian dan pembukaan kunci secara manual), maka pilihan Anda adalah tipe 6 bawaan atau 85. Perbedaannya terletak pada struktur data yang digunakan di balik layar dan kemudahan penggunaan secara keseluruhan 6 didukung oleh larik dinamis, yang membuatnya bagus untuk akses acak yang cepat tetapi memerlukan pengubahan ukuran sesekali saat elemen ditambahkan atau dihapusDaftar mengalokasikan penyimpanan pendukungnya secara berlebihan sehingga tidak setiap push atau pop memerlukan pengubahan ukuran, dan Anda mendapatkan kompleksitas waktu O(1) yang diamortisasi untuk operasi ini. Namun Anda harus berhati-hati untuk hanya memasukkan dan mengeluarkan item menggunakan 86 dan 87. Jika tidak, kinerja melambat menjadi O(n) 85 didukung oleh daftar tertaut ganda, yang mengoptimalkan penambahan dan penghapusan di kedua ujungnya dan memberikan kinerja O(1) yang konsisten untuk operasi ini. Tidak hanya kinerjanya yang lebih stabil, kelas 89 juga lebih mudah digunakan karena Anda tidak perlu khawatir menambahkan atau menghapus item dari ujung yang salahSingkatnya, _85 adalah pilihan yang sangat baik untuk mengimplementasikan tumpukan (antrian LIFO) dengan PythonHilangkan iklanAntrean (FIFO)Di bagian ini, Anda akan melihat cara mengimplementasikan struktur data antrean First-In/First-Out (FIFO) hanya menggunakan tipe dan kelas data bawaan dari pustaka standar Python A adalah kumpulan objek yang mendukung semantik FIFO cepat untuk penyisipan dan penghapusan. Operasi insert dan delete terkadang disebut enqueue dan dequeue. Tidak seperti daftar atau larik, antrean biasanya tidak mengizinkan akses acak ke objek yang ada di dalamnya Inilah analogi dunia nyata untuk antrean FIFO Bayangkan barisan Pythonista menunggu untuk mengambil lencana konferensi mereka pada hari pertama pendaftaran PyCon. Saat orang baru memasuki tempat konferensi dan mengantre untuk menerima lencana mereka, mereka bergabung dengan antrean (enqueue) di belakang antrean. Pengembang menerima lencana dan tas swag konferensi mereka dan kemudian keluar dari antrean (dequeue) di depan antrean Cara lain untuk mengingat karakteristik struktur data antrian adalah dengan menganggapnya sebagai sebuah pipa. Anda menambahkan bola ping-pong ke salah satu ujungnya, dan bola itu bergerak ke ujung lainnya, tempat Anda membuangnya. Saat bola berada dalam antrean (pipa logam padat), Anda tidak bisa mendapatkannya. Satu-satunya cara untuk berinteraksi dengan bola dalam antrean adalah menambahkan yang baru di belakang pipa (enqueue) atau menghapusnya di depan (dequeue) Antrian mirip dengan tumpukan. Perbedaan di antara mereka terletak pada bagaimana item dihapus. Dengan antrean, Anda menghapus item yang paling baru ditambahkan (FIFO) tetapi dengan tumpukan, Anda menghapus item yang paling baru ditambahkan (LIFO) Dari segi kinerja, implementasi antrean yang tepat diharapkan membutuhkan waktu O(1) untuk operasi penyisipan dan penghapusan. Ini adalah dua operasi utama yang dilakukan pada antrian, dan dalam penerapan yang benar, keduanya harus cepat Antrian memiliki berbagai aplikasi dalam algoritme dan sering kali membantu memecahkan masalah penjadwalan dan pemrograman paralel. Algoritme singkat dan indah menggunakan antrian adalah pencarian pertama luas (BFS) pada pohon atau struktur data grafik Algoritma penjadwalan sering menggunakan antrian prioritas secara internal. Ini adalah antrian khusus. Alih-alih mengambil elemen berikutnya dengan waktu penyisipan, a mengambil elemen dengan prioritas tertinggi. Prioritas masing-masing elemen ditentukan oleh antrian berdasarkan urutan yang diterapkan pada kunci mereka Namun, antrean reguler tidak akan menyusun ulang item yang dibawanya. Sama seperti dalam contoh pipa, Anda mengeluarkan apa yang Anda masukkan, dan dalam urutan yang persis seperti itu Python dikirimkan dengan beberapa implementasi antrian yang masing-masing memiliki karakteristik yang sedikit berbeda. Mari kita tinjau >>> from collections import ChainMap >>> dict1 = {"one": 1, "two": 2} >>> dict2 = {"three": 3, "four": 4} >>> chain = ChainMap(dict1, dict2) >>> chain ChainMap({'one': 1, 'two': 2}, {'three': 3, 'four': 4}) >>> # ChainMap searches each collection in the chain >>> # from left to right until it finds the key (or fails): >>> chain["three"] 3 >>> chain["one"] 1 >>> chain["missing"] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'missing' _6. Antrian yang sangat lambatItu mungkin, tetapi ini tidak ideal dari perspektif kinerja. Daftar cukup lambat untuk tujuan ini karena menyisipkan atau menghapus elemen di awal memerlukan pemindahan semua elemen lainnya satu per satu, membutuhkan waktu O(n) Oleh karena itu, saya tidak akan merekomendasikan menggunakan 6 sebagai antrian darurat di Python kecuali jika Anda hanya berurusan dengan sejumlah kecil elemen>>> 9>>> import collections >>> d = collections.OrderedDict(one=1, two=2, three=3) >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3)]) >>> d["four"] = 4 >>> d OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4)]) >>> d.keys() odict_keys(['one', 'two', 'three', 'four']) _85. Antrian Cepat dan KuatKelas _89 mengimplementasikan antrian berujung ganda yang mendukung penambahan dan penghapusan elemen dari salah satu ujung dalam waktu O(1) (tidak diamortisasi). Karena deques mendukung penambahan dan penghapusan elemen dari kedua ujung dengan sama baiknya, mereka dapat berfungsi baik sebagai antrian maupun sebagai tumpukanObjek 89 Python diimplementasikan sebagai daftar tertaut ganda. Ini memberi mereka kinerja yang sangat baik dan konsisten untuk memasukkan dan menghapus elemen, tetapi kinerja O(n) yang buruk untuk mengakses elemen secara acak di tengah tumpukanAkibatnya, _85 adalah pilihan default yang bagus jika Anda mencari struktur data antrian di pustaka standar Python>>> 0>>> from collections import defaultdict >>> dd = defaultdict(list) >>> # Accessing a missing key creates it and >>> # initializes it using the default factory, >>> # i.e. list() in this example: >>> dd["dogs"].append("Rufus") >>> dd["dogs"].append("Kathrin") >>> dd["dogs"].append("Mr Sniffles") >>> dd["dogs"] ['Rufus', 'Kathrin', 'Mr Sniffles'] _13. Mengunci Semantik untuk Komputasi ParalelImplementasi di pustaka standar Python disinkronkan dan menyediakan semantik penguncian untuk mendukung beberapa produsen dan konsumen secara bersamaan Modul _95 berisi beberapa kelas lain yang mengimplementasikan antrean multi-produsen, multi-konsumen yang berguna untuk komputasi paralelBergantung pada kasus penggunaan Anda, semantik penguncian mungkin berguna atau hanya menimbulkan biaya overhead yang tidak dibutuhkan. Dalam hal ini, sebaiknya Anda menggunakan 85 sebagai antrean tujuan umum>>> 1>>> from collections import defaultdict >>> dd = defaultdict(list) >>> # Accessing a missing key creates it and >>> # initializes it using the default factory, >>> # i.e. list() in this example: >>> dd["dogs"].append("Rufus") >>> dd["dogs"].append("Kathrin") >>> dd["dogs"].append("Mr Sniffles") >>> dd["dogs"] ['Rufus', 'Kathrin', 'Mr Sniffles'] _17. Antrean Pekerjaan Bersamaadalah implementasi antrean pekerjaan bersama yang memungkinkan item antrean diproses secara paralel oleh beberapa pekerja bersamaan. Paralelisasi berbasis proses populer di CPython karena kunci juru bahasa global (GIL) yang mencegah beberapa bentuk eksekusi paralel pada satu proses juru bahasa Sebagai implementasi antrean khusus yang dimaksudkan untuk berbagi data antar proses, 17 mempermudah pendistribusian pekerjaan ke berbagai proses untuk mengatasi batasan GIL. Jenis antrean ini dapat menyimpan dan mentransfer objek yang dapat diawetkan melintasi batas proses>>> 2Antrean dengan Python. RingkasanPython menyertakan beberapa implementasi antrian sebagai bagian dari bahasa inti dan pustaka standarnya 6 objek dapat digunakan sebagai antrian, tetapi ini umumnya tidak disarankan karena kinerja yang lambatJika Anda tidak mencari dukungan pemrosesan paralel, implementasi yang ditawarkan oleh 85 adalah pilihan default yang sangat baik untuk mengimplementasikan struktur data antrean FIFO di Python. Ini memberikan karakteristik kinerja yang Anda harapkan dari penerapan antrean yang baik dan juga dapat digunakan sebagai tumpukan (antrian LIFO)Antrian PrioritasA adalah struktur data wadah yang mengelola kumpulan catatan dengan kunci yang diurutkan secara total untuk menyediakan akses cepat ke catatan dengan kunci terkecil atau terbesar di kumpulan Anda dapat menganggap antrean prioritas sebagai antrean yang dimodifikasi. Alih-alih mengambil elemen berikutnya dengan waktu penyisipan, ia mengambil elemen dengan prioritas tertinggi. Prioritas masing-masing elemen ditentukan oleh urutan yang diterapkan pada kuncinya Antrian prioritas biasanya digunakan untuk menangani masalah penjadwalan. Misalnya, Anda mungkin menggunakannya untuk mengutamakan tugas dengan urgensi yang lebih tinggi Pikirkan tentang pekerjaan penjadwal tugas sistem operasi Idealnya, tugas dengan prioritas lebih tinggi pada sistem (seperti bermain game waktu nyata) harus didahulukan daripada tugas dengan prioritas lebih rendah (seperti mengunduh pembaruan di latar belakang). Dengan mengatur tugas yang tertunda dalam antrean prioritas yang menggunakan urgensi tugas sebagai kuncinya, penjadwal tugas dapat dengan cepat memilih tugas dengan prioritas tertinggi dan mengizinkannya untuk dijalankan terlebih dahulu Di bagian ini, Anda akan melihat beberapa opsi bagaimana Anda dapat mengimplementasikan antrian prioritas di Python menggunakan struktur data bawaan atau struktur data yang termasuk dalam pustaka standar Python. Setiap implementasi akan memiliki kelebihan dan kekurangannya sendiri, tetapi menurut saya ada pemenang yang jelas untuk skenario yang paling umum. Mari kita cari tahu yang mana itu >>> from collections import ChainMap >>> dict1 = {"one": 1, "two": 2} >>> dict2 = {"three": 3, "four": 4} >>> chain = ChainMap(dict1, dict2) >>> chain ChainMap({'one': 1, 'two': 2}, {'three': 3, 'four': 4}) >>> # ChainMap searches each collection in the chain >>> # from left to right until it finds the key (or fails): >>> chain["three"] 3 >>> chain["one"] 1 >>> chain["missing"] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'missing' _6. Antrean yang Diurutkan Secara ManualAnda dapat menggunakan 6 yang diurutkan untuk mengidentifikasi dan menghapus elemen terkecil atau terbesar dengan cepat. Kelemahannya adalah memasukkan elemen baru ke dalam daftar adalah operasi O(n) yang lambatSementara titik penyisipan dapat ditemukan dalam waktu O(log n) menggunakan perpustakaan standar, ini selalu didominasi oleh langkah penyisipan yang lambat Mempertahankan urutan dengan menambahkan ke daftar dan menyortir ulang juga membutuhkan setidaknya O(n log n) waktu. Kelemahan lainnya adalah Anda harus secara manual mengatur ulang daftar ketika elemen baru dimasukkan. Sangat mudah untuk memperkenalkan bug dengan melewatkan langkah ini, dan beban selalu ada pada Anda, sang pengembang Ini berarti daftar yang diurutkan hanya cocok sebagai antrian prioritas ketika hanya ada sedikit penyisipan >>> 3>>> from collections import defaultdict >>> dd = defaultdict(list) >>> # Accessing a missing key creates it and >>> # initializes it using the default factory, >>> # i.e. list() in this example: >>> dd["dogs"].append("Rufus") >>> dd["dogs"].append("Kathrin") >>> dd["dogs"].append("Mr Sniffles") >>> dd["dogs"] ['Rufus', 'Kathrin', 'Mr Sniffles'] _25. Tumpukan Biner Berbasis Daftar 25 adalah implementasi tumpukan biner yang biasanya didukung oleh 6 biasa, dan mendukung penyisipan dan ekstraksi elemen terkecil dalam waktu O(log n)Modul ini adalah pilihan yang baik untuk mengimplementasikan antrian prioritas dengan Python. Karena _25 secara teknis hanya menyediakan implementasi min-heap, untuk memastikan stabilitas penyortiran dan fitur lain yang biasanya diharapkan dari antrean prioritas praktis>>> 4>>> from collections import defaultdict >>> dd = defaultdict(list) >>> # Accessing a missing key creates it and >>> # initializes it using the default factory, >>> # i.e. list() in this example: >>> dd["dogs"].append("Rufus") >>> dd["dogs"].append("Kathrin") >>> dd["dogs"].append("Mr Sniffles") >>> dd["dogs"] ['Rufus', 'Kathrin', 'Mr Sniffles'] 29. Antrian Prioritas yang Indahmenggunakan _25 secara internal dan berbagi kompleksitas ruang dan waktu yang sama. Perbedaannya adalah bahwa _32 disinkronkan dan menyediakan semantik penguncian untuk mendukung banyak produsen dan konsumen secara bersamaanBergantung pada kasus penggunaan Anda, ini mungkin membantu, atau mungkin hanya memperlambat program Anda sedikit. Bagaimanapun, Anda mungkin lebih suka antarmuka berbasis kelas yang disediakan oleh 32 daripada antarmuka berbasis fungsi yang disediakan oleh 25>>> 5Antrian Prioritas dengan Python. RingkasanPython menyertakan beberapa implementasi antrean prioritas yang siap untuk Anda gunakan 29 menonjol dari paket dengan antarmuka berorientasi objek yang bagus dan nama yang dengan jelas menyatakan maksudnya. Ini harus menjadi pilihan pilihan AndaJika Anda ingin menghindari penguncian 29, maka menggunakan modul 25 secara langsung juga merupakan pilihan yang baikKesimpulan. Struktur Data PythonItu menyimpulkan tur Anda tentang struktur data umum dengan Python. Dengan pengetahuan yang Anda peroleh di sini, Anda siap menerapkan struktur data efisien yang tepat untuk algoritme atau kasus penggunaan khusus Anda Dalam tutorial ini, Anda telah belajar
Jika Anda menikmati apa yang Anda pelajari dalam contoh ini dari Trik Python, maka pastikan untuk membaca sisa buku ini Jika Anda tertarik untuk meningkatkan pengetahuan struktur data umum Anda, maka saya sangat merekomendasikan Steven S. Manual Desain Algoritma Skiena. Ini memberikan keseimbangan besar antara mengajari Anda struktur data dasar (dan lebih lanjut) dan menunjukkan kepada Anda cara menerapkannya dalam kode Anda. Buku Steve sangat membantu dalam penulisan tutorial ini Tandai sebagai Selesai Tonton Sekarang Tutorial ini memiliki kursus video terkait yang dibuat oleh tim Real Python. Tonton bersama dengan tutorial tertulis untuk memperdalam pemahaman Anda. Tumpukan dan Antrian. Memilih Struktur Data Ideal 🐍 Trik Python 💌 Dapatkan Trik Python singkat & manis yang dikirim ke kotak masuk Anda setiap beberapa hari. Tidak pernah ada spam. Berhenti berlangganan kapan saja. Dikuratori oleh tim Real Python Kirimi Saya Trik Python » Tentang Dan Bader Dan Bader adalah pemilik dan pemimpin redaksi Real Python dan pengembang utama realpython. platform pembelajaran com. Dan telah menulis kode selama lebih dari 20 tahun dan memegang gelar master dalam ilmu komputer » Lebih lanjut tentang DanSetiap tutorial di Real Python dibuat oleh tim pengembang sehingga memenuhi standar kualitas tinggi kami. Anggota tim yang mengerjakan tutorial ini adalah Aldren Daud Joanna Yakub Master Keterampilan Python Dunia Nyata Dengan Akses Tanpa Batas ke Python Nyata Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas pakar Pythonista Tingkatkan Keterampilan Python Anda » Guru Keterampilan Python Dunia Nyata Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas ahli Pythonista Tingkatkan Keterampilan Python Anda » Bagaimana menurut anda? Nilai artikel ini Tweet Bagikan Bagikan EmailApa takeaway # 1 Anda atau hal favorit yang Anda pelajari? Kiat Berkomentar. Komentar yang paling berguna adalah yang ditulis dengan tujuan belajar dari atau membantu siswa lain. dan dapatkan jawaban atas pertanyaan umum di portal dukungan kami Bisakah saya mengimplementasikan struktur data dengan Python?Python memungkinkan penggunanya untuk membuat Struktur Data mereka sendiri memungkinkan mereka untuk memiliki kontrol penuh atas fungsinya. Struktur Data yang paling menonjol adalah Stack, Queue, Tree, Linked List dan sebagainya yang juga tersedia untuk Anda dalam bahasa pemrograman lain.
Apakah Python bagus untuk struktur data dan algoritme?Struktur Data adalah dasar dari setiap bahasa pemrograman di mana sebuah program dibangun. Python membantu mempelajari dasar-dasar struktur data ini dengan cara yang lebih sederhana dibandingkan dengan bahasa pemrograman lain .
Bagaimana Anda menerapkan algoritma dan struktur data?Berikut adalah rencana langkah demi langkah untuk meningkatkan keterampilan struktur data dan algoritme Anda. . Langkah 1. Memahami Kedalaman vs. . Langkah 2. Mulai Pendekatan Kedalaman-Pertama—buat daftar pertanyaan inti. . Langkah 3. Kuasai setiap struktur data. . Langkah 4. Pengulangan Berjarak. . Langkah 5. Isolasi teknik yang digunakan kembali. . Langkah 6. Sekarang, waktunya untuk Breadth |