По заданному словарю, как я могу узнать, задан ли для данного ключа в этом словаре значение, отличное от None?
Т.е. я хочу сделать это:
my_dict = {}
if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1
Т.е. я хочу увеличить значение, если оно уже есть, или установить его на 1 в противном случае.
python
dictionary
Бен
источник
источник
Ответы:
Вы ищете
collections.defaultdict
(доступно для Python 2.5+). этобудет делать то, что вы хотите.
Для обычных Python
dict
, если для данного ключа нет значения, вы не получитеNone
при доступе к dict - aKeyError
будет поднят. Так что если вы хотите использовать обычныйdict
, вместо вашего кода вы бы использовалиисточник
dict
с, вы можете сделатьmy_dict[key] = my_dict.get(key, 0) + 1
.Я предпочитаю делать это в одной строке кода.
В словарях есть функция get, которая принимает два параметра - нужный вам ключ и значение по умолчанию, если оно не существует. Я предпочитаю, чтобы этот метод использовался по умолчанию, поскольку вы хотите обрабатывать только тот случай, когда ключ не существует в этой строке кода, а не везде.
источник
Мне лично нравится использовать
setdefault()
источник
setdefault
является удивительным. Он не изменяет значение, если оно уже установленоsome_key
. Например,d={1:2}; d.setdefault(1, 0)
не мешает значениеd[1]
.Вам нужна
key in dict
идиома для этого.Тем не менее, вы, вероятно, должны рассмотреть возможность использования
defaultdict
(как предложено dF).источник
my_dict[key] is not None
, что яснее (по крайней мере, ИМХО)if key in my_dict and my_dict[key]:
Чтобы ответить на вопрос « как я могу узнать, был ли заданный индекс в этом dict уже не равным None », я бы предпочел следующее:
Это соответствует уже задействованной концепции EAFP (проще просить прощения, чем разрешения). Это также избегает поиска дубликатов ключей в словаре, как это было бы в
key in my_dict and my_dict[key] is not None
том, что интересно, если поиск дорогой.Для реальной проблемы, которую вы поставили, то есть для увеличения значения int, если оно существует, или установки значения по умолчанию в противном случае, я также рекомендую
как в ответе Эндрю Уилкинсона.
Существует третье решение, если вы храните изменяемые объекты в вашем словаре. Типичным примером этого является мультикарта , где вы храните список элементов для ваших ключей. В этом случае вы можете использовать:
Если значение для ключа не существует в словаре, метод setdefault установит для него второй параметр setdefault. Он ведет себя так же, как стандартный my_dict [ключ], возвращая значение для ключа (которое может быть вновь установленным значением).
источник
Договорились с cgoldberg. Как я это делаю
Так что либо делайте это, как указано выше, либо используйте dict по умолчанию, как предлагали другие. Не используйте операторы if. Это не Pythonic.
источник
+=2
или-=1
? Вы должны помнить, чтобы изменить обе строки. Сейчас это может показаться тривиальной вещью, но это те глупые маленькие «тривиальные» ошибки, которые могут вернуться, чтобы укусить вас.Как видно из множества ответов, существует несколько решений. Один экземпляр LBYL (посмотрите, прежде чем прыгнуть) еще не был упомянут, метод has_key ():
источник
То, как вы пытаетесь это сделать, называется LBYL (посмотрите, прежде чем прыгнуть), так как вы проверяете условия, прежде чем пытаться увеличить свое значение.
Другой подход называется EAFP (проще просить прощения, чем разрешения). В этом случае вы просто попытаетесь выполнить операцию (увеличить значение). Если это не удается, вы перехватываете исключение и устанавливаете значение 1. Это немного более Pythonic способ сделать это (IMO).
http://mail.python.org/pipermail/python-list/2003-May/205182.html
источник
Немного поздно, но это должно сработать.
источник
Это не прямой ответ на вопрос, но для меня это выглядит так, как будто вам может понадобиться функциональность коллекций . Счетчик .
Это приводит к выводу
источник
defaultdict(int)
с некоторыми дополнительными функциями, поэтому он будет отлично работать при работе исключительно с целыми числами, но вы не показываете какое-либо соответствующее поведение.Вот одна строка, которую я недавно придумал для решения этой проблемы. Он основан на методе словаря setdefault :
источник
Я искал это, не нашел его в сети, затем попытал счастья с помощью Try / Error и нашел его
источник
__contains__
в производственном коде. Кстати.__contains__
так же, как использованиеis
.my_dict.__contains__(some_key)
равнозначноsome_key in my_dict
, перегрузка дляin
оператора нетis