2012-11-09 2 views
0

Есть ли более правильный способ сделать следующее:инкремента значения потенциально пустых ключей словаря питона

if a in dic.keys(): 
    dic[a] += 1 
else: 
    dic[a] = 1 

Т.е. для увеличения значений, соответствующих клавишам в словаре, когда эти ключи могут отсутствовать.

+1

Как вы прокручиваете ключи dict, но затем сталкиваетесь с ключами, которых нет? –

+0

Вот что происходит, когда вы вставляете код, но меняете его на более общий, а затем не читаете его должным образом перед отправкой. Я отредактировал итерацию (что имеет смысл в исходном контексте) – jsj

+0

Нет ни одного «правильного», но «defaultdict» является самым быстрым, IIRC. – georg

ответ

7

Вы можете использовать defaultdict, чтобы обеспечить значение по умолчанию для ключей нет в словаре.

>>> d = defaultdict(int) 
>>> d[1] += 1 
>>> d[1] 
    1 
>>> d[5] 
    0 
+0

Мне нужны только записи для ключей, значение которых 0> 0 – jsj

+1

Что это значит? Defaultdict обрабатывает ситуацию, представленную в вопросе. – Tim

+0

Ahh Я вижу сейчас ... извините, что меня затормозили. – jsj

9

Использование dict.get:

dic[a] = dic.get(a, 0) + 1 
+0

Отлично, спасибо. Это нечетный синтаксис, хотя tbh - немного низкий уровень удобочитаемости – jsj

+0

@ trideceth12 Что не хватает читаемости? Что бы Вы хотели? –

+0

Это лучше, чем подтвержденный ответ? С одной стороны, требуется импорт, с другой - синтаксис слабее. –

1

вы можете использовать dict.setdefault():

In [12]: dic=dict(zip(('a','b'),[0]*2)) 

In [13]: dic 
Out[13]: {'a': 0, 'b': 0} 

In [14]: dic['c']=dic.setdefault('c',0)+1 

In [15]: dic 
Out[15]: {'a': 0, 'b': 0, 'c': 1} 

In [16]: dic['a']=dic.setdefault('a',0)+1 

In [17]: dic 
Out[17]: {'a': 1, 'b': 0, 'c': 1} 

с помощью цикла:

In [18]: dic=dict(zip(('a','b'),[0]*2)) 

In [19]: for x in ('a','b','c','a'): 
    ....:  dic[x]=dic.setdefault(x,0)+1 
    ....:  

In [20]: dic 
Out[20]: {'a': 2, 'b': 1, 'c': 1} 
2

Вы можете использовать collections.Counter()

dic = collections.Counter() 
dic['a'] += 1 
dic['b'] # will be zero 

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

+0

Я закончил с этим, но принятый ответ более общеприменим – jsj

+0

Правда, но Counter предоставляет другие тонкости. Например, вы можете добавить два объекта Counter. –

Смежные вопросы