Возможно ли в python обновить или инициализировать ключ словаря с помощью одной команды? - PullRequest
6 голосов
/ 02 сентября 2011

Например, скажем, я хочу построить гистограмму, я бы сказал так:

hist = {}
for entry in data:
    if entry["location"] in hist:
        hist[entry["location"]] += 1
    else:
        hist[entry["location"]] = 1

Есть ли способ избежать проверки существования и инициализировать или обновить ключ в зависимости от его существования?

Ответы [ 4 ]

19 голосов
/ 02 сентября 2011

Здесь вы хотите получить defaultdict:

from collections import defaultdict
hist = defaultdict(int)
for entry in data:
    hist[entry["location"]] += 1

defaultdict default-конструирует любую запись, которая еще не существует в dict, поэтому для int они начинаются с 0, а выпросто добавьте по одному для каждого предмета.

11 голосов
/ 02 сентября 2011

Да, вы можете сделать:

hist[entry["location"]] = hist.get(entry["location"], 0) + 1

Для справочных типов вы часто можете использовать setdefault для этой цели, но это не подходит, когда правая часть вашего dict представляет собой целое число.

Update( hist.setdefault( entry["location"], MakeNewEntry() ) )
6 голосов
/ 02 сентября 2011

Я знаю, что вы уже приняли ответ, но вы точно знаете, что начиная с Python 2.7, есть также модуль Counter, который явно создан для таких ситуаций.

from collections import Counter

hist = Counter()
for entry in data:
    hist[entry['location']] += 1

http://docs.python.org/library/collections.html#collections.Counter

1 голос
/ 02 сентября 2011

Является ли троичный оператор одной командой?

hist[entry["location"]] = hist[entry["location"]]+1 if entry["location"] in hist else 1

(отредактировано, потому что я испортил его в первый раз)

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