Jawaban:
Untuk menghapus kunci terlepas dari apakah itu ada di kamus, gunakan bentuk dua argumen dict.pop()
:
my_dict.pop('key', None)
Ini akan kembali my_dict[key]
jika key
ada di kamus, dan None
sebaliknya. Jika parameter kedua tidak ditentukan (mis. my_dict.pop('key')
) Dan key
tidak ada, a KeyError
dinaikkan.
Untuk menghapus kunci yang dijamin ada, Anda juga bisa menggunakan
del my_dict['key']
Ini akan menaikkan a KeyError
jika kunci tidak ada dalam kamus.
pop()
lebih del
: mengembalikan nilai untuk kunci itu. Dengan cara ini Anda bisa mendapatkan dan menghapus entri dari dict dalam satu baris kode.
try
/ except
solusi jika kuncinya tidak ada. Anda mungkin menemukan satu atau yang lain lebih mudah dibaca, yang baik-baik saja. Keduanya adalah Python idiomatik, jadi pilihlah apa pun yang Anda inginkan. Tetapi mengklaim bahwa jawaban ini lebih kompleks atau tidak efisien sama sekali tidak masuk akal.
self
, jadi akan agak mengejutkan jika yang ini melakukannya.
Khusus untuk menjawab, "Apakah ada satu cara untuk melakukan ini?"
if 'key' in my_dict: del my_dict['key']
... yah, kamu bertanya ;-)
Namun, Anda harus mempertimbangkan bahwa cara menghapus objek dari a dict
ini bukan atomik — itu 'key'
mungkin terjadi pada my_dict
saat if
pernyataan, tetapi dapat dihapus sebelum del
dieksekusi, dalam hal ini del
akan gagal dengan a KeyError
. Mengingat ini, akan lebih aman untuk menggunakandict.pop
atau sesuatu di sepanjang garis
try:
del my_dict['key']
except KeyError:
pass
yang, tentu saja, jelas bukan one-liner.
pop
pasti lebih ringkas, meskipun ada satu keuntungan utama dari melakukannya dengan cara ini: segera jelas apa yang dilakukannya.
try/except
pernyataan lebih mahal. Memunculkan pengecualian lambat.
try
sedikit lebih cepat, meskipun jika tidak, try
memang jauh lebih lambat. pop
cukup konsisten tetapi lebih lambat dari semua tetapi try
dengan kunci yang tidak ada. Lihat gist.github.com/zigg/6280653 . Pada akhirnya, itu tergantung pada seberapa sering Anda mengharapkan kunci untuk benar-benar berada di kamus, dan apakah Anda memerlukan atomicity atau tidak, dan, tentu saja, apakah Anda terlibat dalam optimasi prematur;)
if 'key' in mydict: #then del...
. Saya perlu mengeluarkan kunci / val dari dict untuk mengurai dengan benar, pop bukan solusi yang sempurna.
Butuh beberapa waktu untuk mencari tahu apa yang sebenarnya my_dict.pop("key", None)
dilakukan. Jadi saya akan menambahkan ini sebagai jawaban untuk menghemat waktu Googling orang lain:
pop(key[, default])
Jika kunci ada di kamus, hapus dan kembalikan nilainya, kalau tidak kembalikan standar . Jika default tidak diberikan dan kunci tidak ada dalam kamus, a
KeyError
dinaikkan.
dict.pop?
dalam IPython.
del my_dict[key]
sedikit lebih cepat daripada my_dict.pop(key)
untuk menghapus kunci dari kamus ketika kunci ada
>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"
>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786
Tetapi ketika kuncinya tidak ada if key in my_dict: del my_dict[key]
sedikit lebih cepat dari my_dict.pop(key, None)
. Keduanya setidaknya tiga kali lebih cepat daripada del
dalam try
/ except
pernyataan:
>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
... del d['missing key']
... except KeyError:
... pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133
pop
a del
. Membuat kamus akan sepenuhnya menghapus barang-barang darinya.
del
dan pop
dari set pertama timing di atas)
Jika Anda perlu menghapus banyak kunci dari kamus dalam satu baris kode, saya pikir menggunakan peta () cukup ringkas dan Pythonic dapat dibaca:
myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}
Dan jika Anda perlu menangkap kesalahan ketika Anda memberi nilai yang tidak ada dalam kamus, gunakan lambda inside map () seperti ini:
map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}
atau di python3
, Anda harus menggunakan pemahaman daftar sebagai gantinya:
[myDict.pop(x, None) for x in ['a', 'c', 'e']]
Berhasil. Dan 'e' tidak menyebabkan kesalahan, meskipun myDict tidak memiliki kunci 'e'.
map
dan teman-teman sekarang malas dan mengembalikan iterators. Menggunakan map
efek samping umumnya dianggap praktik buruk; for ... in
loop standar akan lebih baik. Lihat Tampilan dan Iterator Daripada Daftar untuk informasi lebih lanjut.
[myDict.pop(i, None) for i in ['a', 'c']]
, karena mereka menawarkan alternatif umum untuk map
(dan filter
).
for ... in
loop reguler .
map()
, yang sering digunakan untuk efek sampingnya. Alternatif yang direkomendasikan dalam Python adalah daftar pemahaman, yang menurut saya masih cukup mudah dibaca dan secara kognitif ringan sebagai satu-liner (lihat pertanyaan). Hanya digunakan untuk efek sampingnya, kedua konstruksi tersebut memang menghasilkan daftar yang tidak berguna, yang dapat menjadi tidak efisien. Pada Python3, saya tidak mengetahui fungsi bawaan yang dapat dengan aman dan elegan diulang melalui ekspresi generator, tanpa misalnya produk sampingan yang mahal loop(d.pop(k) for k in ['a', 'b'])
.
Menggunakan kata kunci "del":
del dict[key]
Kami dapat menghapus kunci dari kamus Python dengan beberapa pendekatan berikut.
Menggunakan del
kata kunci; itu pendekatan yang hampir sama seperti yang Anda lakukan -
myDict = {'one': 100, 'two': 200, 'three': 300 }
print(myDict) # {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : del myDict['one']
print(myDict) # {'two': 200, 'three': 300}
Atau
Kita dapat melakukan hal-hal berikut:
Tetapi orang harus ingat bahwa, dalam proses ini sebenarnya itu tidak akan menghapus kunci apa pun dari kamus daripada membuat kunci spesifik dikecualikan dari kamus itu. Selain itu, saya mengamati bahwa itu mengembalikan kamus yang tidak dipesan sama dengan myDict
.
myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}
Jika kita menjalankannya di shell, ia akan menjalankan sesuatu seperti {'five': 500, 'four': 400, 'three': 300, 'two': 200}
- perhatikan bahwa itu tidak sama dengan yang dipesan myDict
. Sekali lagi jika kita mencoba untuk mencetak myDict
, maka kita dapat melihat semua kunci termasuk yang kita kecualikan dari kamus dengan pendekatan ini. Namun, kita dapat membuat kamus baru dengan menetapkan pernyataan berikut ke dalam variabel:
var = {key:value for key, value in myDict.items() if key != 'one'}
Sekarang jika kita mencoba mencetaknya, maka itu akan mengikuti perintah induk:
print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}
Atau
Menggunakan pop()
metode.
myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)
if myDict.get('one') : myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
Perbedaan antara del
dan pop
apakah itu, menggunakan pop()
metode, kita sebenarnya dapat menyimpan nilai kunci jika diperlukan, seperti yang berikut:
myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var) # 100
Hancurkan inti ini untuk referensi di masa mendatang, jika menurut Anda ini berguna.
if myDict.get('one')
untuk memeriksa apakah ada kunci! Gagal jika myDict ['one'] memiliki nilai falsey. Juga, dikte tidak memiliki urutan bawaan, jadi tidak masuk akal untuk menyebutkannya.
Anda dapat menggunakan penanganan pengecualian jika Anda ingin menjadi sangat verbose:
try:
del dict[key]
except KeyError: pass
Namun, ini lebih lambat daripada pop()
metode ini, jika kuncinya tidak ada.
my_dict.pop('key', None)
Tidak masalah untuk beberapa tombol, tetapi jika Anda melakukan ini berulang kali, maka metode terakhir adalah taruhan yang lebih baik.
Pendekatan tercepat adalah ini:
if 'key' in dict:
del myDict['key']
Tetapi metode ini berbahaya karena jika 'key'
dihilangkan di antara dua garis, KeyError
akan dinaikkan.
Cara lain adalah dengan Menggunakan item () + pemahaman dict
item () ditambah dengan pemahaman dict juga dapat membantu kami mencapai tugas penghapusan pasangan kunci-nilai tetapi, memiliki kelemahan karena tidak menjadi teknik dict tempat. Sebenarnya dict baru jika dibuat kecuali untuk kunci yang tidak ingin kami sertakan.
test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}
# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))
# Using items() + dict comprehension to remove a dict. pair
# removes vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}
# Printing dictionary after removal
print ("dictionary after remove is : " + str(new_dict))
Keluaran:
dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}
ini akan berubah
my_dict
di tempat (bisa berubah)
my_dict.pop('key', None)
buat dikte baru (tidak berubah)
dic1 = {
"x":1,
"y": 2,
"z": 3
}
def func1(item):
return item[0]!= "x" and item[0] != "y"
print(
dict(
filter(
lambda item: item[0] != "x" and item[0] != "y",
dic1.items()
)
)
)