Secara alami, kamus adalah pemetaan satu-ke-satu, tetapi tidak sulit untuk menjadikannya satu-ke-banyak — dengan kata lain, untuk membuat satu peta kunci ke banyak nilai. Ada dua kemungkinan pendekatan, bergantung pada bagaimana Anda ingin memperlakukan duplikasi dalam kumpulan nilai untuk kunci. Pendekatan berikut memungkinkan duplikasi tersebut
d1 = {} d1.setdefault(key, []).append(value)sementara pendekatan ini secara otomatis menghilangkan duplikasi
d2 = {} d2.setdefault(key, {})[value] = 1_Kamus normal melakukan pemetaan sederhana dari kunci ke nilai. Resep ini menunjukkan dua cara mudah dan efisien untuk mencapai pemetaan setiap kunci ke beberapa nilai. Semantik dari kedua pendekatan tersebut sedikit berbeda tetapi yang terpenting adalah bagaimana mereka menghadapi duplikasi. Setiap pendekatan bergantung pada metode kamus d2 = {} d2.setdefault(key, {})[value] = 17 untuk menginisialisasi entri untuk kunci dalam kamus, jika diperlukan, dan dalam hal apa pun untuk mengembalikan entri tersebut
Tentu saja, Anda harus dapat melakukan lebih dari sekadar menambahkan nilai untuk sebuah kunci. Dengan pendekatan pertama, yang memungkinkan duplikasi, berikut cara mengambil daftar nilai untuk sebuah kunci
list_of_values = d1[key]Berikut cara menghapus satu nilai untuk kunci, jika Anda tidak keberatan meninggalkan daftar kosong sebagai item d2 = {} d2.setdefault(key, {})[value] = 18 saat nilai terakhir untuk kunci dihapus
d1[key].remove(value)Meskipun daftarnya kosong, masih mudah untuk menguji keberadaan kunci dengan setidaknya satu nilai
Ini mengembalikan d2 = {} d2.setdefault(key, {})[value] = 1_9 atau daftar, yang mungkin kosong. Dalam kebanyakan kasus, lebih mudah menggunakan fungsi yang selalu mengembalikan daftar (mungkin yang kosong), seperti
def get_values_if_any(d, key): return d.get(key, [])_Anda dapat menggunakan salah satu dari fungsi ini dalam sebuah pernyataan. Sebagai contoh
if get_values_if_any(d1, somekey): if has_key_with_some_values(d1, somekey):_Namun, list_of_values = d1[key]_0 umumnya lebih mudah. Misalnya, Anda dapat menggunakannya untuk memeriksa apakah list_of_values = d1[key]1 adalah salah satu nilai untuk list_of_values = d1[key]2
if 'freep' in get_values_if_any(d1, somekey):Kecekatan ekstra ini berasal dari list_of_values = d1[key]_0 selalu mengembalikan daftar, daripada terkadang daftar dan terkadang d2 = {} d2.setdefault(key, {})[value] = 19
Pendekatan pertama memungkinkan setiap nilai hadir beberapa kali untuk setiap kunci yang diberikan. Sebagai contoh
example = {} example.setdefault('a', []).append('apple') example.setdefault('b', []).append('boots') example.setdefault('c', []).append('cat') example.setdefault('a', []).append('ant') example.setdefault('a', []).append('apple')Sekarang list_of_values = d1[key]5 adalah list_of_values = d1[key]6. Jika sekarang kita mengeksekusi
tes berikut masih puas
d2 = {} d2.setdefault(key, {})[value] = 1_0list_of_values = d1[key]7 hadir dua kali, dan kami menghapusnya hanya sekali. (Pengujian untuk list_of_values = d1[key]_7 dengan list_of_values = d1[key]9 akan lebih umum, meskipun setara dalam kasus ini. )
Pendekatan kedua, yang menghilangkan duplikasi, membutuhkan idiom yang agak mirip. Berikut cara mengambil daftar nilai untuk kunci
d2 = {} d2.setdefault(key, {})[value] = 1_1Berikut cara menghapus pasangan kunci/nilai, meninggalkan kamus kosong sebagai item d1[key].remove(value)0 saat nilai terakhir untuk kunci dihapus
d2 = {} d2.setdefault(key, {})[value] = 1_2Fungsi d1[key].remove(value)_1 yang ditunjukkan sebelumnya juga berfungsi untuk pendekatan kedua, dan Anda juga memiliki alternatif yang serupa, seperti
d2 = {} d2.setdefault(key, {})[value] = 1_3Pendekatan kedua tidak mengizinkan duplikasi. Sebagai contoh
Sekarang list_of_values = d1[key]5 adalah d1[key].remove(value)3. Sekarang, jika kita mengeksekusi
d2 = {} d2.setdefault(key, {})[value] = 1_5tes berikut tidak puas
d2 = {} d2.setdefault(key, {})[value] = 1_0list_of_values = d1[key]7 ada, tetapi kami baru saja menghapusnya
Resep ini berfokus pada cara membuat kode fungsionalitas mentah, tetapi jika Anda ingin menggunakan fungsionalitas ini secara sistematis, Anda ingin membungkusnya di kelas. Untuk itu, Anda perlu membuat beberapa keputusan desain yang disorot oleh resep. Apakah Anda ingin nilai berada di entri untuk kunci beberapa kali?