Oke, ini adalah sesuatu yang telah menggangguku beberapa kali, jadi terima kasih Jayesh untuk menanyakannya.
Jawaban di atas sepertinya solusi yang baik, tetapi jika Anda menggunakan ini di seluruh kode Anda, masuk akal untuk membungkus fungsi IMHO. Juga, ada dua kemungkinan penggunaan di sini: satu di mana Anda peduli apakah semua kata kunci ada dalam kamus asli. dan satu di mana Anda tidak. Akan menyenangkan untuk memperlakukan keduanya dengan setara.
Jadi, untuk nilai dua sen saya, saya sarankan menulis sub-kelas kamus, mis
class my_dict(dict):
def subdict(self, keywords, fragile=False):
d = {}
for k in keywords:
try:
d[k] = self[k]
except KeyError:
if fragile:
raise
return d
Sekarang Anda bisa mengeluarkan sub-kamus dengan
orig_dict.subdict(keywords)
Contoh penggunaan:
#
## our keywords are letters of the alphabet
keywords = 'abcdefghijklmnopqrstuvwxyz'
#
## our dictionary maps letters to their index
d = my_dict([(k,i) for i,k in enumerate(keywords)])
print('Original dictionary:\n%r\n\n' % (d,))
#
## constructing a sub-dictionary with good keywords
oddkeywords = keywords[::2]
subd = d.subdict(oddkeywords)
print('Dictionary from odd numbered keys:\n%r\n\n' % (subd,))
#
## constructing a sub-dictionary with mixture of good and bad keywords
somebadkeywords = keywords[1::2] + 'A'
try:
subd2 = d.subdict(somebadkeywords)
print("We shouldn't see this message")
except KeyError:
print("subd2 construction fails:")
print("\toriginal dictionary doesn't contain some keys\n\n")
#
## Trying again with fragile set to false
try:
subd3 = d.subdict(somebadkeywords, fragile=False)
print('Dictionary constructed using some bad keys:\n%r\n\n' % (subd3,))
except KeyError:
print("We shouldn't see this message")
Jika Anda menjalankan semua kode di atas, Anda akan melihat (seperti) output berikut (maaf untuk pemformatan):
Kamus asli:
{'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3, 'g': 6, 'f': 5, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'm': 12, 'l': 11, 'o': 14, 'n': 13, 'q': 16, 'p': 15, 's': 18, 'r': 17, 'u': 20, 't': 19, 'w': 22, 'v': 21, 'y': 24, 'x ': 23,' z ': 25}
Kamus dari kunci bernomor ganjil:
{'a': 0, 'c': 2, 'e': 4, 'g': 6, 'i': 8, 'k': 10, 'm': 12, ' o ': 14,' q ': 16,' s ': 18,' u ': 20,' w ': 22,' y ': 24}
konstruksi subd2 gagal:
kamus asli tidak mengandung beberapa kunci
Kamus dikonstruksi menggunakan beberapa kunci buruk:
{'b': 1, 'd': 3, 'f': 5, 'h': 7, 'j': 9, 'l': 11, 'n': 13, 'p': 15, 'r': 17, 't': 19, 'v': 21, 'x': 23, 'z': 25}
bigdict
tidak mengandungk