Удалить ключ из словаря по его значению
Есть словарь вида:
dict_ = {
"key1": value1,
"key2": value2,
"key3": value3,
"key4": value4
}
Мне нужно удалить ключ key1 если value1 равно 1 и ключ key3 если value3 равно 3. Т.е. по сути мне надо удалять ключи не по их названию, а по их значению.
Это можно как-то реализовать?
Ответы (7 шт):
Можно сделать так
if dict_["key1"] == 1:
del dict_["key1"]
if dict_['key3'] ==3:
del dict_["key3"]
Решил вот таким образом:
key_list = ["key1", "key2", "key3", "key4"]
for key in key_list:
if dict_[key] == 1 or dict_[key] == 3:
dict_.pop(key)
obj = {
"key1": 'value1',
"key2": 'value2',
"key3": 'value3',
"key4": 'value4',
"key5": 'value1'
}
items_for_remove = ['value1', 'value3']
print(
dict(
filter(
lambda x: x[1] not in items_for_remove,
obj.items()
)
)
)
# {'key2': 'value2', 'key4': 'value4'}
Если это делать с привязкой к ключам то можно так:
obj = {
"key1": 'value1',
"key2": 'value2',
"key3": 'value3',
"key4": 'value4',
"key5": 'value1'
}
items_for_remove = [('key1', 'value1'), ('key3', 'value3')]
print(
dict(
filter(
lambda x: x not in items_for_remove,
obj.items()
)
)
)
# {'key2': 'value2', 'key4': 'value4', 'key5': 'value1'}
Как вариант если вы знаете, что значения в словаре уникальны можно использовать dict comprehension:
test_dict = {"петя" : 22, "саша" : 20, "катя" : 1, "настя" : 21,"антон":22}
new_dict = {key:val for key,val in test_dict.items() if val != 22}
print('new_dict: ',new_dict)
new_dict: {'саша': 20, 'катя': 1, 'настя': 21}
Раз вас устраивает логика в вашем ответе, покажу как избавиться от перечисления вручную ключей и сократить условие, и не использовать такой непонятный и нестабильный or
key_list = dict_.copy().keys()
for key in key_list:
if dict_[key] in (1, 3):
dict_.pop(key)
Чтобы не получать исключения при удалении элементов из оригинального словаря, я создаю его копию и забираю только ключи, которые будут храниться в key_list. И в условии я вам дал альтернативу конструкции с or
Можно и так попробовать
dict_ = {
"key1": value1,
"key2": value2,
"key3": value3,
"key4": value4
}
for k, v in dict_:
array_v = []
array_v.append(v)
if array_v[1] == 1:
del dict_['key1']
if array_v[3] == 3:
del dict_['key3']
for key, val in (("key1", 1), ("key3", 3)):
if dict_[key] == val:
del dict_[key]
Это решение точно для вашего вопроса.
Но когда я буду следовать логике из вашего ответа, то вы хотите что-то другое:
Удалить все ключи из данного списка ключей, которые имеют как
значение лубое из запрещенных чисел.
Тогда мой код будет немножко другим:
only_keys = ("key1", "key3")
bad_values = (1, 3)
for key in only_keys:
if dict_[key] in bad_values:
del dict_[key]
Примечание:
Когда ключей много и вам не хочется писать много кавычек и запятых, как например
only_keys = ("key1", "key3", "key7", "key10", "key15", "key23", "key42", "key55")
используйте конструкцию
only_keys = "key1 key3 key7 key10 key15 key23 key42 key55".split()