Проверьте, если данный ключ уже существует в словаре и увеличить его
учитывая словарь, как я могу узнать, если данный ключ в этом словаре уже установлен в значение не-None?
т. е., я хочу сделать это:
my_dict = {}
if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1
т. е. я хочу увеличить значение, если оно уже есть, или установить его в 1 в противном случае.
12 ответов:
вы ищете
collections.defaultdict(доступно для Python 2.5+). Этоfrom collections import defaultdict my_dict = defaultdict(int) my_dict[key] += 1будет делать то, что вы хотите.
для обычного Python
dicts, Если нет значения для данного ключа, вы будете не getNoneпри доступе к dict -- aKeyErrorбудет поднят. Так что если вы хотите использовать обычныйdict, вместо вашего кода, Вы должны использоватьif key in my_dict: my_dict[key] += 1 else: my_dict[key] = 1
Я предпочитаю делать это в одной строке кода.
my_dict = {} my_dict[some_key] = my_dict.get(some_key, 0) + 1словари имеют функцию get, которая принимает два параметра-ключ, который вы хотите, и значение по умолчанию, если оно не существует. Я предпочитаю этот метод defaultdict, поскольку вы хотите обрабатывать только тот случай, когда ключ не существует в этой одной строке кода, а не везде.
вам нужно
key in dictидиома для этого.if key in my_dict and not (my_dict[key] is None): # do something else: # do something elseоднако, вы должны, вероятно, рассмотреть возможность использования
defaultdict(как предложил dF).
мне лично нравится использовать
setdefault()my_dict = {} my_dict.setdefault(some_key, 0) my_dict[some_key] += 1
ответить на вопрос "как я могу узнать, если данный индекс в этом dict уже установлен в значение не-None", Я бы предпочел этот:
try: nonNone = my_dict[key] is not None except KeyError: nonNone = Falseэто соответствует уже вызванной концепции EAFP (легче попросить прощения, чем разрешение). Это также позволяет избежать дублирования поиска ключа в словаре, как это было бы в
key in my_dict and my_dict[key] is not Noneчто интересно, если поиск идет дороже.для
Как вы можете видеть из многих ответов, есть несколько решений. Один экземпляр LBYL (look before you leap) еще не был упомянут, метод has_key ():
my_dict = {} def add (key): if my_dict.has_key(key): my_dict[key] += 1 else: my_dict[key] = 1 if __name__ == '__main__': add("foo") add("bar") add("foo") print my_dict
согласен с cgoldberg. Как я это делаю:
try: dict[key] += 1 except KeyError: dict[key] = 1поэтому либо сделайте это, как указано выше, либо используйте dict по умолчанию, как предлагали другие. Не используйте операторы if. Это не питон.
немного поздно, но это должно работать.
my_dict = {} my_dict[key] = my_dict[key] + 1 if key in my_dict else 1
способ, которым вы пытаетесь это сделать, называется LBYL (посмотрите, прежде чем прыгать), так как вы проверяете условия, прежде чем пытаться увеличить свое значение.
другой подход называется EAFP (проще попросить прощения, чем разрешение). В этом случае вы просто попытаетесь выполнить операцию (увеличить значение). Если это не удается, вы ловите исключение и устанавливаете значение 1. Это немного более подходящие для Python способ сделать это (ММО.)
http://mail.python.org/pipermail/python-list/2003-May/205182.html
это не прямой ответ на вопрос, но мне кажется, что вам может понадобиться функциональность сборники.Счетчик.
from collections import Counter to_count = ["foo", "foo", "bar", "baz", "foo", "bar"] count = Counter(to_count) print(count) print("acts just like the desired dictionary:") print("bar occurs {} times".format(count["bar"])) print("any item that does not occur in the list is set to 0:") print("dog occurs {} times".format(count["dog"])) print("can iterate over items from most frequent to least:") for item, times in count.most_common(): print("{} occurs {} times".format(item, times))это приводит к выходу
Counter({'foo': 3, 'bar': 2, 'baz': 1}) acts just like the desired dictionary: bar occurs 2 times any item that does not occur in the list is set to 0: dog occurs 0 times can iterate over items from most frequent to least: foo occurs 3 times bar occurs 2 times baz occurs 1 times
вот один-лайнер, который я придумал недавно для решения этой проблемы. Это основано на setdefault метод словарь:
my_dict = {} my_dict[key] = my_dict.setdefault(key, 0) + 1
Я искал его, не нашел его в интернете, затем попробовал свою удачу с Try / Error и нашел его
my_dict = {} if my_dict.__contains__(some_key): my_dict[some_key] += 1 else: my_dict[some_key] = 1
Comments