Вступление
В этой статье мы рассмотрим, как удалить ключи из словарей Python .
Это можно сделать с помощью функции pop()
, del
и dict-пониманий.
Удалить ключ с помощью pop (key, d)
Функция pop(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 [ключ]
Другой способ удалить ключ из словаря - использовать ключевое слово
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
имеет преимущество перед остальными методами. Хотя
для небольших словарей разница во времени не кажется такой уж большой.
Хотя, когда размер словаря большой, это окажет огромное влияние.
Заключение
В этой статье мы узнали о трех способах удаления пары ключ-значение из
словаря - pop()
, del
и dict. Выбор правильного метода для
правильного размера словаря может помочь уменьшить время выполнения
скрипта и использование памяти.