Удалить элемент словаря на основе dict.values()

#python #python-2.7

#python #python-2.7

Вопрос:

Если строка ’email’ отсутствует в значениях dict, я хочу удалить соответствующий элемент, поэтому я сделал следующее:

 [ my_dict.pop(k) for k , val in my_dict.items() if 'email' not in val ]
  

Итак, есть ли лучшее решение для этого?
Лучше ли написать длинную строку кода, как указано выше, или выполнить следующее:

     for k , val in my_dict.items():
        if 'email' not in val:
            my_dict.pop(k)
  

Ответ №1:

Не используйте понимание списка, если вы не собираетесь использовать список! Аналогично, не используйте dict.pop , если вы не собираетесь использовать всплывающее значение. Также не рекомендуется переопределять встроенные имена, такие как dict . Более pythonic было бы:

 for key, val in my_dict.items():
    if 'email' not in val:
        del my_dict[key]
  

Комментарии:

1. Спасибо, да, я знаю, что мы не будем переопределять встроенные имена, просто я написал dict здесь в качестве примера, теперь я изменил описание

Ответ №2:

Вы удаляете на основе аспекта значения. На мой взгляд, ваш подход неплох, особенно если у вас будет мало доступной памяти.

Другим подходом было бы понимание словаря, которое должно быть немного быстрее, но требует больше памяти, поскольку вы будете копировать старый словарь в новый:

 my_dict = {key: val for key, val in my_dict.items() if 'email' not in val}
  

Насколько я помню, подобные словарные понимания были введены в Python 2.7. В качестве альтернативы, вы также можете сделать это:

 dict = my_dict([(key, val) for key, val in my_dict.items() if 'email' not in val])
  

Я бы рекомендовал выбирать между вашим текущим подходом и моим, исходя из ожидаемого размера словаря и ограничений памяти.