Python periksa apakah kunci ada di dua kamus

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)

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 keys_ menghasilkan daftar semua kunci kamus. Sangat menggoda untuk jatuh ke dalam perangkap hanya menggunakan

intersect = []
for item in some_dict.keys(  ):
    if item in another_dict.keys(  ):
        intersect.append(item)
print "Intersects:", intersect
0, 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:", intersect
1, lalu setiap kali mengulang semua
intersect = []
for item in some_dict.keys(  ):
    if item in another_dict.keys(  ):
        intersect.append(item)
print "Intersects:", intersect
2. 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:", intersect
2 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:", intersect
2 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:", intersect
5 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:", intersect
1, sedangkan yang lebih besar berperan sebagai
intersect = []
for item in some_dict.keys(  ):
    if item in another_dict.keys(  ):
        intersect.append(item)
print "Intersects:", intersect
2 (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:", intersect
0. 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:", intersect
2 pada daftar
intersect = []
for item in some_dict.keys(  ):
    if another_dict.has_key(item):
        intersect.append(item)
print "Intersects:", intersect
3. 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:", intersect
5, 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:", intersect
1. 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:", intersect
1. 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:", intersect
8 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:", intersect
1,
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; .