Как добавить или увеличить запись в словаре?
в настоящее время я снова занимаюсь Python после долгого отсутствия и люблю его. Тем не менее, я обнаруживаю, что снова и снова сталкиваюсь с шаблоном. Я продолжаю думать, что должен быть лучший способ выразить то, что я хочу, и что я, вероятно, делаю это неправильно.
код, который я пишу, находится в следующем виде:
# foo is a dictionary
if foo.has_key(bar):
foo[bar] += 1
else:
foo[bar] = 1
Я пишу это много в моих программах. Моя первая реакция-вытолкнуть его в вспомогательную функцию, но так часто библиотеки python поставляют такие вещи уже случались.
есть ли какой-то простой маленький синтаксический трюк, который мне не хватает? Или это то, как это должно быть сделано?
5 ответов:
использовать
defaultdict
:from collections import defaultdict foo = defaultdict(int) foo[bar] += 1
в Python >= 2.7, у вас также есть отдельная счетчик класс для этих целей. Для Python 2.5 и 2.6, можно использовать backported version.
The
dict
' sget()
метод принимает необязательный второй параметр, который может быть использован для предоставления значения по умолчанию, если запрошенный ключ не найден:foo[bar] = foo.get(bar, 0) + 1
Я сделал некоторые сравнения. Практически равны. Однострочный
.get()
команда быстрее, хотя.выход:
get 0.543551800627 exception 0.587318710994 haskey 0.598421703081
код:
import timeit import random RANDLIST = [random.randint(0, 1000) for i in range(10000)] def get(): foo = {} for bar in RANDLIST: foo[bar] = foo.get(bar, 0) + 1 def exception(): foo = {} for bar in RANDLIST: try: foo[bar] += 1 except KeyError: foo[bar] = 1 def haskey(): foo = {} for bar in RANDLIST: if foo.has_key(bar): foo[bar] += 1 else: foo[bar] = 1 def main(): print 'get', timeit.timeit('get()', 'from __main__ import get', number=100) print 'exception', timeit.timeit('exception()', 'from __main__ import exception', number=100) print 'haskey', timeit.timeit('haskey()', 'from __main__ import haskey', number=100) if __name__ == '__main__': main()