Kamus adalah representasi konkret yang baik untuk set di Python, jadi operasi seperti persimpangan adalah hal biasa. Katakanlah Anda memiliki dua kamus (tetapi anggaplah masing-masing berisi ribuan item) Show some_dict = { 'zope':'zzz', 'python':'rocks' } another_dict = { 'python':'rocks', 'perl':'$' } Inilah cara yang buruk untuk menemukan persimpangan mereka yang sangat lambat intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect_ Dan inilah cara bagus yang sederhana dan cepat intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect Dalam Python2. 2, berikut ini elegan dan bahkan lebih cepat print "Intersects:", [k for k in some_dict if k in another_dict] Dan inilah pendekatan alternatif yang menang dalam kecepatan, untuk Python 1. 5. 2 dan selanjutnya print "Intersects:", filter(another_dict.has_key, some_dict.keys())_ Metode intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect0, dengan daftar ini sebagai sisi kanan, untuk menguji keanggotaan. Namun, pada contoh pertama, Anda mengulang semua intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect1, lalu setiap kali mengulang semua intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect2. Jika intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect_1 memiliki N1 item, dan intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect2 memiliki N2 item, operasi persimpangan Anda akan memiliki waktu komputasi yang sebanding dengan perkalian N1x N2. (O(N1x N2) adalah notasi ilmu komputer umum untuk menunjukkan hal ini. ) Dengan menggunakan metode intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect_5, Anda tidak mengulang intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect2 lagi, melainkan memeriksa kunci di tabel hash kamus. Waktu pemrosesan untuk intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect5 pada dasarnya tidak bergantung pada ukuran kamus, jadi pendekatan kedua adalah O(N1). Perbedaannya cukup besar untuk kamus besar. Jika kedua kamus sangat berbeda ukurannya, penting untuk menggunakan yang lebih kecil sebagai intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect1, sedangkan yang lebih besar berperan sebagai intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect2 (i. e. , ulangi tombol kamus yang lebih kecil, jadi pilih N1 yang lebih kecil) Piton 2. 2 memungkinkan Anda mengulang kunci kamus secara langsung, dengan pernyataan for key in dict Anda bisa menguji keanggotaan dengan cara yang sama elegannya if key in dict bukannya setara tapi secara sintaksis kurang bagus intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect0. Menggabungkan dua inovasi kecil tapi bagus dari Python 2. 2 dengan notasi pemahaman-daftar yang diperkenalkan di Python 2. 0, kami berakhir dengan pendekatan yang sangat elegan, yang pada saat yang sama ringkas, jelas, dan cukup cepat Namun, pendekatan tercepat adalah yang menggunakan intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect_1 dengan metode terikat intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect2 pada daftar intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect3. Persimpangan tipikal dari dua kamus berisi 500 item dengan tumpang tindih 50%, pada tipikal mesin murah saat ini (AMD Athlon 1. 4GHz, DDR2100 RAM, Mandrake Linux 8. 1), mengambil 710 mikrodetik menggunakan intersect = [] for item in some_dict.keys( ): if item in another_dict.keys( ): intersect.append(item) print "Intersects:", intersect5, 450 mikrodetik menggunakan Python 2. 2 teknik, dan 280 mikrodetik menggunakan cara berbasis intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect1. Sementara perbedaan kecepatan ini hampir substansial, mereka tidak seberapa jika dibandingkan dengan waktu jalan yang buruk, di mana persimpangan tipikal memerlukan waktu 22.600 mikrodetik—30 kali lebih lama daripada jalan sederhana dan 80 kali lebih lama daripada jalan berbasis intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect1. Inilah kode pengaturan waktu, yang menunjukkan contoh tipikal tentang bagaimana seseorang mengukur kecepatan relatif dari konstruksi Python yang setara import time def timeo(fun, n=1000): def void( ): pass start = time.clock( ) for i in range(n): void( ) stend = time.clock( ) overhead = stend - start start = time.clock( ) for i in range(n): fun( ) stend = time.clock( ) thetime = stend-start return fun._ _name_ _, thetime-overhead to500 = {} for i in range(500): to500[i] = 1 evens = {} for i in range(0, 1000, 2): evens[i] = 1 def simpleway( ): result = [] for k in to500.keys( ): if evens.has_key(k): result.append(k) return result def pyth22way( ): return [k for k in to500 if k in evens] def filterway( ): return filter(evens.has_key, to500.keys( )) def badsloway( ): result = [] for k in to500.keys( ): if k in evens.keys( ): result.append(k) return result for f in simpleway, pyth22way, filterway, badsloway: print "%s: %.2f"%timeo(f) Anda dapat menyimpan kode ini ke dalam file intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect_7 dan menjalankannya (beberapa kali, pada mesin yang diam, tentu saja) dengan intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect8 untuk memeriksa bagaimana pengaturan waktu dari berbagai konstruksi dibandingkan pada mesin tertentu yang Anda minati. (Perhatikan bahwa skrip ini membutuhkan Python 2. 2 atau lebih baru. ) Pengaturan waktu potongan kode yang berbeda untuk mengetahui bagaimana perbandingan kecepatan relatif mereka adalah teknik Python yang penting, karena intuisi adalah panduan yang terkenal tidak dapat diandalkan untuk perbandingan kecepatan relatif semacam itu. Untuk petunjuk rinci dan umum tentang cara mengatur waktu, lihat pengantar Bab 17 Jika berlaku tanpa harus menggunakan formulir intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect_9 atau fungsi yang ditulis secara khusus, intersect = [] for item in some_dict.keys( ): if another_dict.has_key(item): intersect.append(item) print "Intersects:", intersect1, print "Intersects:", [k for k in some_dict if k in another_dict]1, dan print "Intersects:", [k for k in some_dict if k in another_dict]2 sering menawarkan solusi tercepat untuk setiap masalah yang diberikan. Tentu saja, seorang Pythonista yang pandai hanya memperhatikan kecepatan untuk operasi yang sangat, sangat sedikit di mana kecepatan benar-benar lebih penting daripada kejelasan, kesederhanaan, dan keanggunan. Tapi built-in ini juga cukup elegan dengan caranya sendiri Kami tidak memiliki resep terpisah untuk penyatuan kunci dari dua kamus, tetapi itu karena tugasnya lebih mudah, berkat metode print "Intersects:", [k for k in some_dict if k in another_dict]3 kamus Bagaimana Anda memeriksa apakah ada kunci di dua kamus Python?Memeriksa apakah ada kunci menggunakan metode get()
. Jika kunci tidak ada, ia mengembalikan nilai default (jika diteruskan) atau mengembalikan Tidak ada. Dengan menggunakan metode ini kita dapat memberikan kunci dan memeriksa apakah ada kunci di kamus python.
Bagaimana Anda tahu jika dua kamus memiliki kunci yang sama?Teknik paling sederhana untuk memeriksa apakah dua atau beberapa kamus sama adalah dengan menggunakan operator == di Python . Anda dapat membuat kamus dengan salah satu metode yang didefinisikan dalam Python dan kemudian membandingkannya menggunakan operator ==. Itu akan mengembalikan Benar kamus sama dan Salah jika tidak.
Bagaimana cara membandingkan dua kunci kamus dengan Python?Metode perbandingan cmp() digunakan dalam Python untuk membandingkan nilai dan kunci dari dua kamus. Jika metode mengembalikan 0 jika kedua kamus sama, 1 jika dic1 > dict2 dan -1 jika dict1 < dict2.
Bagaimana Anda memeriksa apakah ada kunci dalam daftar kamus?Menggunakan Keys() Fungsi keys() dan operator "in" dapat digunakan untuk melihat apakah ada kunci dalam kamus. Metode keys() mengembalikan daftar kunci dalam kamus, dan pernyataan "if, in" memeriksa apakah kunci yang disediakan ada dalam daftar. Ini mengembalikan True jika kuncinya ada; . |