Python setdefault не lvalue, какие-нибудь обходные пути? - PullRequest
0 голосов
/ 23 января 2012

У меня есть следующая небольшая программа:

ages=[23,23,43,54,34,22,43,23]

histogram={}
for age in ages:
    if not age in histogram:
        histogram[age]=1
    else:
        histogram[age]+=1

for age,count in sorted(histogram.items()):
    print "Age: %d Number of people: %d"%(age,count)

Создает простую гистограмму возрастов людей в списке.Тем не менее, я нахожу двойной поиск в хеш гистограммы довольно неприглядным.Я знаю, что доступ к хешу в основном O (1), так что это не так неэффективно, как может показаться, но все же ...

Я пробовал различные обходные пути, такие как попытка использовать setdefault,но следующее не сработает:

histogram.setdefault("age",0)+=1 #<- Incorrect

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

Еслиу меня был способ поставить этот вопрос на «низкий приоритет», потому что, очевидно, это не очень важно.Но я долго искал умное и / или изящное решение этой проблемы.

Итак, вопрос в том, как увеличить целое число ключом в dict или установить его в1 если его не существует?

Ответы [ 4 ]

5 голосов
/ 23 января 2012

Для этого конкретного приложения вы должны использовать a Counter.

from collections import Counter

ages = [23,23,43,54,34,22,43,23]

histogram = Counter(ages)

for age,count in sorted(histogram.items()):
    print "Age: %d Number of people: %d"%(age,count)

Если вам действительно нужен dict, вы можете преобразовать Counter обратно в dict с помощью конструктора dict.

histogram = dict(Counter(args))
1 голос
/ 23 января 2012

Это как collections.Counter делает подсчет , адаптированный к вашему примеру.

histogram_get = histogram.get
for age in ages:
    histogram[age] = histogram_get(age, 0) + 1
0 голосов
/ 20 апреля 2013
histogram.setdefault("age", [0])[0] += 1
0 голосов
/ 23 января 2012

Вы можете инициализировать диктовку заранее, т.е.

histogram = dict(((a, 0) for a in set(ages)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...