Python: как удалить ключ из словаря
В этой статье мы рассмотрим, как удалить ключи из словарей Python. Это можно сделать с помощью функции pop()
, ключевого слова del
и создания нового словоря.
Удалить ключ с помощью pop(key, d)
Функция pop(key, d)
удаляет ключ из словаря и возвращает его значение. Требуется два аргумента: key
- удаляемый ключ и необязательное возвращаемое значение d
, если ключ не найден. Вот пример извлечения элемента только с обязательным аргументом key
:
my_dict = {1: "a", 2: "b"}
popped_value = my_dict.pop(1)
line = "The value removed from the dictionary of the key: 1 is {}"
print(line.format(popped_value))
Этот фрагмент кода возвращает следующий результат:
The value removed from the dictionary of the key: 1 is a
Теперь посмотрим, что происходит, когда мы пытаемся удалить несуществующий ключ:
my_dict = {1: "a", 2: "b"}
popped_value = my_dict.pop(3)
line = "The value removed from the dictionary of the key: 3 is {}"
print(line.format(popped_value))
Это вызывает KeyError, как и ожидалось, поскольку его не существует:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 3
Если вы вызовете pop()
с ключом, который не существует, Python вернет KeyError
. Поэтому используйте pop(key)
только в том случае, если вы уверены, что ключ существует в словаре.
Если вы не уверены, существует ли ключ, введите значение для второго необязательного аргумента pop()
- значение по умолчанию. Вместо выдачи KeyError он вернет это значение.
Приведенный выше фрагмент можно переписать как:
my_dict = {1: "a", 2: "b"}
removed_value = my_dict.pop(3, None)
line = "The value removed from the dictionary of the key: 3 is {}"
print(line.format(removed_value))
И теперь он не выдает ошибку при запуске:
The value removed from the dictionary of the key: 3 is None
Удалить ключ с помощью del dict[key]
Другой способ удалить ключ из словаря - использовать del
ключевое слово. Это ключевое слово может удалить любой объект. Он также может удалить пару ключ-значение словаря следующим образом del dict_name[key]
:
my_dict = {1: "a", 2: "b"}
del my_dict[1]
line = "The dictionary after deletion is {}"
print(line.format(my_dict))
Приведенный выше фрагмент возвращает следующий вывод, обозначающий словарь только с оставленными значениями:
The dictionary after deletion is {2: 'b'}
В отличие от pop()
, при удалении значение не возвращается. Если вы хотите сохранить существующий ввод словаря, следующий раздел будет вам полезен.
Удаление нескольких ключей словаря с помощью создания нового словаря
Предыдущие методы обновляют словарь на месте, что означает, что пара ключ-значение уничтожается. Если исходный ключ необходимо сохранить, мы можем использовать для этого специальную функцию. В Python общеизвестно, что мы можем использовать составные части списков для создания нового списка на основе существующего. Мы можем сделать то же самое со словарями, используя словарные интерпретации.
Поэтому вместо удаления значений в списке мы можем использовать понимание dict для создания нового словаря с условием, исключающим значения, которые нам не нужны.
Рассмотрим следующий пример, в котором мы создаем новый словарь без ключа 1
:
my_dict = {1: "a", 2: "b"}
my_dict2 = {k: v for k, v in my_dict.items() if k != 1}
line = "The new dictionary is {}"
print(line.format(my_dict2))
Этот фрагмент кода генерирует следующий вывод, распечатывая новый словарь:
The new dictionary is {2: 'b'}
Обратите внимание, что мы создаем новый словарь, увеличивая использование памяти нашей программой. Для словарей большего размера, если мы не исключаем много членов, мы почти удваиваем объем памяти, используемый для этих данных.
Эффективность подходов выше
До сих пор мы наблюдали три метода. Но какой из трех методов самый быстрый?
Давайте создадим случайный словарь, на котором мы будем тестировать наши методы. Следующая функция gen_random_dict(n)
принимает список в качестве аргумента и создает словарь со случайными начальными целыми числами:
import random
def gen_random_dict(n):
random.seed(0)
mydict = {}
for i in range(n):
nmbr = random.randrange(1, n, 1)
mydict[nmbr] = "value "+ str(nmbr)
return mydict
В этот же файл добавим несколько функций, которые удаляют ключ каждым из рассмотренных нами способов:
# Remove a key using pop function
def remove_using_pop(dict_input):
dict_input.pop(1)
return None
# Remove a key using del keyword
def remove_using_del(dict_input):
del dict_input[1]
return None
# Remove a key using condition
def remove_using_condition(dict_input):
return {k: v for k, v in dict_input.items() if k != 1}
Наконец, добавьте следующий код, который использует модуль timeit
, измеряющий время выполнения нашего кода:
import timeit
if __name__ == "__main__":
func_to_be_tested = "remove_using_pop(gen_random_dict(10000))"
setup_stmt = "from __main__ import remove_using_pop, gen_random_dict"
runtime1 = timeit.timeit(func_to_be_tested, setup=setup_stmt, number=1)
func_to_be_tested = "remove_using_del(gen_random_dict(10000))"
setup_stmt = "from __main__ import remove_using_del, gen_random_dict"
runtime2 = timeit.timeit(func_to_be_tested, setup=setup_stmt, number=1)
func_to_be_tested = "remove_using_condition(gen_random_dict(10000))"
setup_stmt = "from __main__ import remove_using_condition, gen_random_dict"
runtime3 = timeit.timeit(func_to_be_tested, setup=setup_stmt, number=1)
print("Runtime for removing key from Dict:")
print("\t1) Using Pop: {}".format(str(runtime1)))
print("\t2) Using Del: {}".format(str(runtime2)))
print("\t3) Using Condition: {}".format(str(runtime3)))
Хотя результаты могут отличаться на вашем компьютере, шаблон должен быть последовательным. Вот результат, который мы получили после выполнения этого скрипта:
Runtime for removing key from Dict:
1) Using Pop: 0.015606499999194057
2) Using Del: 0.01090950000070734
3) Using Condition: 0.011443700001109391
Использование ключевого слова del
имеет преимущество перед остальными методами. Хотя для небольших словарей разница во времени не кажется очень большой.