Pertanyaan Bagaimana cara menghapus kunci dari kamus Python?


Ketika mencoba untuk menghapus kunci dari kamus, saya menulis:

if 'key' in myDict:
    del myDict['key']

Apakah ada cara satu baris untuk melakukan ini?


1048
2018-06-30 20:27


asal


Jawaban:


Menggunakan dict.pop():

my_dict.pop('key', None)

Ini akan kembali my_dict[key] jika key ada di kamus, dan None jika tidak. Jika parameter kedua tidak ditentukan (mis. my_dict.pop('key')) dan key tidak ada, a KeyError dibesarkan.


1744
2018-06-30 20:29



Secara khusus untuk menjawab "apakah ada cara satu baris untuk melakukan ini?"

if 'key' in myDict: del myDict['key']

...bisa saja kamu bertanya ;-)

Anda harus mempertimbangkan, bahwa cara menghapus objek dari a dict aku s bukan atom—adalah mungkin itu 'key' mungkin di myDict selama if pernyataan, tetapi dapat dihapus sebelumnya del dieksekusi, dalam hal ini del akan gagal dengan KeyError. Mengingat ini, itu akan menjadi yang paling aman juga menggunakan dict.pop atau sesuatu di sepanjang garis

try:
    del myDict['key']
except KeyError:
    pass

yang tentu saja sudah pasti tidak satu-liner.


260
2018-06-30 20:36



Butuh beberapa waktu untuk mencari tahu apa sebenarnya my_dict.pop("key", None) sedang melakukan. Jadi saya akan menambahkan ini sebagai jawaban untuk menghemat waktu googling orang lain:

pop (key [, default])

Jika kuncinya ada di kamus, keluarkan dan kembalikan nilainya, lain   kembali default. Jika default tidak diberikan dan kunci tidak di   kamus, KeyError dibangkitkan

Dokumentasi


115
2018-03-04 16:43



Pemilihan waktu dari tiga solusi yang dijelaskan di atas.

Kamus kecil:

>>> import timeit
>>> timeit.timeit("d={'a':1}; d.pop('a')")
0.23399464370632472
>>> timeit.timeit("d={'a':1}; del d['a']")
0.15225347193388927
>>> timeit.timeit("d={'a':1}; d2 = {key: val for key, val in d.items() if key != 'a'}")
0.5365207354998063

Kamus yang lebih besar:

>>> timeit.timeit("d={nr: nr for nr in range(100)}; d.pop(3)")
5.478138627299643
>>> timeit.timeit("d={nr: nr for nr in range(100)}; del d[3]")
5.362219126590048
>>> timeit.timeit("d={nr: nr for nr in range(100)}; d2 = {key: val for key, val in d.items() if key != 3}")
13.93129749387532

25
2017-12-07 12:19



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 saat Anda memasukkan nilai yang tidak ada dalam kamus, gunakan lambda di dalam peta () seperti ini:

map(lambda x: myDict.pop(x,None), ['a','c','e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}

Berhasil. Dan 'e' tidak menyebabkan kesalahan, meskipun myDict tidak memiliki kunci 'e'.


20
2017-09-16 19:17



Menggunakan:

>>> if myDict.get(key): myDict.pop(key)

Cara lain:

>>> {k:v for k, v in myDict.items() if k != 'key'}

Anda dapat menghapus berdasarkan ketentuan. Tidak ada kesalahan jika key tidak ada.


14
2017-12-07 05:52



Menggunakan kata kunci "del":

del dict[key]

5
2018-05-02 10:22



Kita dapat menghapus kunci dari kamus Python dengan beberapa pendekatan berikut.

Menggunakan del kata kunci; itu pendekatan yang hampir sama seperti yang Anda lakukan meskipun -

 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 bisa melakukan seperti berikut:

Tetapi orang harus ingat bahwa dalam proses ini sebenarnya tidak menghapus kunci apa saja dari kamus daripada membuat kunci tertentu dikecualikan dari kamus itu. Selain itu, saya mengamati bahwa ia 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 jalankan di shell, itu akan mengeksekusi sesuatu seperti itu {'five': 500, 'four': 400, 'three': 300, 'two': 200} - perhatikan bahwa itu tidak sama diperintahkan myDict. Sekali lagi jika kita mencoba mencetak myDict, maka kita bisa melihat semua kunci termasuk yang kami 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 untuk mencetaknya, maka itu akan mengikuti urutan 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 benar-benar 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

3
2018-05-19 10:09