Проверьте, если данный ключ уже существует в словаре и увеличить его



учитывая словарь, как я могу узнать, если данный ключ в этом словаре уже установлен в значение не-None?



т. е., я хочу сделать это:



my_dict = {}

if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1


т. е. я хочу увеличить значение, если оно уже есть, или установить его в 1 в противном случае.

536   12  

12 ответов:

вы ищете collections.defaultdict (доступно для Python 2.5+). Это

from collections import defaultdict

my_dict = defaultdict(int)
my_dict[key] += 1

будет делать то, что вы хотите.

для обычного Python dicts, Если нет значения для данного ключа, вы будете не get None при доступе к dict -- a KeyError будет поднят. Так что если вы хотите использовать обычный 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

    Ничего не найдено.