Я хотел проверить, существует ли ключ в словаре, прежде чем обновлять значение ключа. Я написал следующий код:
if 'key1' in dict.keys():
print "blah"
else:
print "boo"
Я думаю, что это не лучший способ выполнить эту задачу. Есть ли лучший способ проверить ключ в словаре?
python
dictionary
Мохан Гулати
источник
источник
dict.keys()
создает список ключей, согласно документации docs.python.org/2/library/stdtypes.html#dict.keys, но я был бы удивлен, если бы этот шаблон не был оптимизирован для, в серьезной реализации, для перевода кif 'key1' in dict:
.x in dict.keys()
для проверки ключей. И это произошло потому , что обычный способ для перебора ключей в Явеfor (Type k : dict.keySet())
, эта привычка вызываетfor k in dict.keys()
к чувствовать себя более естественно, чемfor k in dict
(что все еще должно быть хорошо с точки зрения производительности?), но затем проверка ключей становитсяif k in dict.keys()
тоже, что является проблемой ...if k in dict_:
проверяет наличие k в KEYS dict_, поэтому вам все еще не нужноdict_.keys()
. (Это меня немного поразило, так как читается как тестирование значения в dict. Но это не так.)Ответы:
in
это предполагаемый способ проверки на наличие ключа вdict
.Если вы хотели по умолчанию, вы всегда можете использовать
dict.get()
:и если вы хотите всегда гарантировать значение по умолчанию для любого ключа, который вы можете использовать
dict.setdefault()
повторно илиdefaultdict
изcollections
модуля, например, так:но в целом
in
ключевое слово - лучший способ сделать это.источник
get
если я все равно собираюсь вытянуть предмет из словаря. Нет смысла использоватьin
и вытаскивать предмет из словаря.in
это лучший способ сделать это.0
например, Узнал это трудным путем: /Вам не нужно называть ключи:
Это будет намного быстрее, так как он использует хеширование словаря, а не линейный поиск, как это делают вызывающие ключи.
источник
if key in d1
ушло0.17265701293945312
несколько секунд. Вызовif key in d1.keys()
занял0.23871088027954102
- это классическое определение микрооптимизации. Экономия0.07884883880615234
секунд - это не повышение производительности.keys()
дает вам 0,01 секунды вычислительной выгоды. За ~ 500 000 ключей отказ от звонкаkeys()
дает вам .1 второе преимущество. Для ~ 5 000 000 ключей, не звонитьkeys()
на 0,4 секунды быстрее, но для 50 000 000 ключей ВЫЗОВ - НАkeys()
3 СЕКУНДЫ БЫСТРЕЕ!Вы можете проверить наличие ключа в словаре, используя ключевое слово in :
Обычное использование для проверки существования ключа в словаре перед его изменением - инициализация значения по умолчанию (например, если ваши значения являются списками, и вы хотите убедиться, что существует пустой список, к которому вы можете добавить при вставке первого значения для ключа). В таких случаях вы можете найти
collections.defaultdict()
интересующий вас тип.В старом коде вы также можете найти некоторые способы
has_key()
использования устаревшего метода для проверки наличия ключей в словарях (просто используйтеkey_name in dict_name
вместо этого).источник
key in dict.keys()
. Попробуйте удалить весь код, кроме этой проверки, и посмотрите, каков ваш результат.Вы можете сократить это:
Однако это в лучшем случае косметическое улучшение. Почему вы считаете, что это не самый лучший способ?
источник
Для получения дополнительной информации о быстром выполнении предложенного метода предложенного ответа (петли 10 м):
'key' in mydict
прошедшее время 1,07 секmydict.get('key')
прошедшее время 1,84 секmydefaultdict['key']
прошедшее время 1,07 секПоэтому используйте
in
илиdefaultdict
рекомендуется противget
.источник
get
1.84s <1.07 * 2 ;-PЯ бы рекомендовал использовать
setdefault
метод вместо. Похоже, он будет делать все, что вы хотите.источник
setdefault
общего с вопросом ОП?Словарь в python имеет метод get ('key', default). Таким образом, вы можете просто установить значение по умолчанию, если нет ключа.
источник
Как насчет использования EAFP (проще просить прощения, чем разрешения):
Смотрите другие SO сообщения:
Используя try vs if в python или
Проверка существования члена в Python
источник
Использование троичного оператора:
источник
Способы, которыми вы можете получить результаты:
Что лучше, зависит от 3 вещей:
Подробнее: http://paltman.com/try-except-performance-in-python-a-simple-test/
Использование try / block вместо «in» или «if»:
источник
2to3
и увидел, что синтаксис без try всегда быстрее, чем синтаксис с try, даже в случае, когда ключ находится в dict.Только Python 2: (и Python 2.7
in
уже поддерживает )Вы можете использовать метод has_key ():
источник
.has_key()
было устаревшим ; Вы должны использовать,in
как показано в других ответах.Просто добавление к Крису. B (лучший ответ):
Работает так же; причина в том, что вызов
int()
return,0
что иdefaultdict
происходит за кулисами (при создании словаря), отсюда и название «Factory Function» в документации.источник
defaultdict(lambda: 0)
вместо,defaultdict(int)
потому что я думаю, что яснее, что происходит; читателю не нужно знать, что вы получите,0
если позвонитеint()
без аргументов. YMMV.Чтобы понять, как это сделать, мы сначала проверим, какие методы мы можем вызвать в словаре. Вот методы:
Жестоким методом проверки того, существует ли ключ, может быть
get()
метод:Два других интересных метода
items()
иkeys()
звучит как слишком много работы. Итак, давайте рассмотрим,get()
является ли правильный метод для нас. У нас есть наш диктd
:Печать показывает, что ключ, которого у нас нет, вернется
None
:Мы
можемиспользовать это, чтобы получить информацию, если ключ присутствует или нет. Но учтите это, если мы создадим dict с однимkey:None
:Ведущий
get()
методом не является надежным в случае, если некоторые значения могут бытьNone
. У этой истории должен быть более счастливый конец. Если мы используемin
компаратор:Мы получаем правильные результаты. Мы можем изучить байт-код Python:
Это показывает, что
in
оператор сравнения не просто более надежен, но даже быстрее, чемget()
.источник
.get()
может иметь второй аргумент дляdefault
значения, который может быть использован для решения проблемы, гдеkey:None
. пример:d.get("key", False)
.get()
это самый быстрый способ. Другим вариантом является назначение вtry
/except
блокВ словаре Python есть метод, который называется
__contains__
. Этот метод возвращает True, если в словаре есть ключ, иначе возвращается False.источник
__contains__
напрямую - очень плохая практика . Правильный способ сделать это, это использоватьin
оператор, которыйcontainment check
вызывает__contains__
функцию.foo = x['foo'] if x.__contains__('foo') else 'bar'
. Любые идеи, как бы использоватьin
оператор как часть этого выражения?foo = x['foo'] if 'foo' in x else 'bar'
Совместное использование еще одного способа проверки наличия ключа с использованием логических операторов.
Это возвращает
объяснение
Во- первых , вы должны знать , что в Python,
0
,None
или объекты с нулевой длиной вычислятьсяFalse
. Все остальное оценивается какTrue
. Булевы операции оцениваются слева направо и возвращают операнд не True или False.Давайте посмотрим на пример:
Так как
'Some string'
оценивается какTrue
, остальная частьor
не оценивается, и нет деления на ноль возникших ошибок.Но если мы переключаемся, порядок
1/0
оценивается первым и вызывает исключение:Мы можем использовать это для шаблона для проверки, существует ли ключ.
делает так же, как
Это уже возвращает правильный результат, если ключ существует, но мы хотим, чтобы он печатал 'boo', когда его нет. Итак, мы берем результат и
or
его'boo'
источник
Вы можете использовать
for
цикл для перебора словаря и получить имя ключа, который вы хотите найти в словаре, после этого проверьте, существует ли он или нет, используяif
условие:источник
it is exist
иnot exist