Menghapus item dari kamus ketika utamanya adalah tidak diketahui

Apa cara terbaik untuk menghapus item dari kamus dengan nilai, yaitu ketika item's kunci yang tidak diketahui? Berikut ini's pendekatan yang sederhana:

for key, item in some_dict.items():
    if item is item_to_remove:
        del some_dict[key]

Ada cara yang lebih baik? Apakah ada sesuatu yang salah dengan bermutasi (menghapus item) dari kamus sementara iterasi itu?

Mengomentari pertanyaan (2)

The dict.pop(key [default]) metode ini memungkinkan anda untuk menghapus item ketika anda tahu kuncinya. Ia mengembalikan nilai di kunci jika menghilangkan item jika tidak maka kembali apa yang dilewatkan sebagai default. Lihat docs.'

Contoh:

>>> dic = {'a':1, 'b':2}
>>> dic
{'a': 1, 'b': 2}
>>> dic.pop('c', 0)
0
>>> dic.pop('a', 0)
1
>>> dic
{'b': 2}
Komentar (1)
Larutan

Diketahui bahwa anda're saat ini pengujian yang dilakukan untuk objek identitas (adalah hanya mengembalikan True jika kedua operan yang diwakili oleh objek yang sama di memori - ini tidak selalu kasus dengan dua objek yang dibandingkan sama dengan ==). Jika anda melakukan ini dengan sengaja, maka anda bisa menulis ulang kode anda sebagai

some_dict = {key: value for key, value in some_dict.items() 
             if value is not value_to_remove}

Tapi ini tidak dapat melakukan apa yang anda inginkan:

>>> some_dict = {1: "Hello", 2: "Goodbye", 3: "You say yes", 4: "I say no"}
>>> value_to_remove = "You say yes"
>>> some_dict = {key: value for key, value in some_dict.items() if value is not value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 3: 'You say yes', 4: 'I say no'}
>>> some_dict = {key: value for key, value in some_dict.items() if value != value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 4: 'I say no'}

Jadi anda mungkin ingin != bukan tidak.

Komentar (5)
a = {'name': 'your_name','class': 4}
if 'name' in a: del a['name']
Komentar (1)

Perbandingan sederhana antara del dan pop():

import timeit
code = """
results = {'A': 1, 'B': 2, 'C': 3}
del results['A']
del results['B']
"""
print timeit.timeit(code, number=100000)
code = """
results = {'A': 1, 'B': 2, 'C': 3}
results.pop('A')
results.pop('B')
"""
print timeit.timeit(code, number=100000)

hasilnya:

0.0329667857143
0.0451040902256

Jadi, del lebih dari pop().

Komentar (3)

I'a membangun sebuah daftar kunci yang perlu melepas, kemudian menghapusnya. It's sederhana, efisien dan menghindari masalah tentang secara bersamaan iterasi dan bermutasi dengan dict.

keys_to_remove = [key for key, value in some_dict.iteritems()
                  if value == value_to_remove]
for key in keys_to_remove:
    del some_dict[key]
Komentar (1)

item() mengembalikan daftar, dan itu adalah bahwa daftar yang anda iterasi, sehingga bermutasi yang dict dalam lingkaran doesn't peduli di sini. Jika anda menggunakan iteritems() bukan, bermutasi yang dict dalam lingkaran akan bermasalah, dan demikian juga untuk viewitems() dalam Python 2.7.

Saya dapat't memikirkan cara yang lebih baik untuk menghapus item dari dict dengan nilai.

Komentar (0)

c adalah kamus baru, dan anda asli kamus, {'z','w'} ini adalah kunci yang ingin anda hapus dari

c = {key:a[key] for key in a.keys() - {'z', 'w'}}

Juga memeriksa: https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html

Komentar (0)
y={'username':'admin','machine':['a','b','c']}
if 'c' in y['machine'] : del y['machine'][y['machine'].index('c')]
Komentar (0)

Tidak ada yang salah dengan menghapus item dari kamus sementara iterasi, seperti anda've diusulkan. Berhati-hati tentang beberapa benang menggunakan kamus yang sama pada waktu yang sama, yang dapat mengakibatkan KeyError atau masalah lainnya.

Tentu saja, melihat dokumen di http://docs.python.org/library/stdtypes.html#typesmapping

Komentar (2)

Ini adalah bagaimana saya akan melakukannya.

for key in some_dict.keys():
    if some_dict[key] == item_to_remove:
        some_dict.pop(key)
        break
Komentar (0)