2016-10-22 3 views
0

Итак, в моем коде у меня есть словарь я использую, чтобы подсчитывать предметы я не имею никаких предварительных знаний:Лучший способ писать «Назначьте или, если это невозможно - B»

if a_thing not in my_dict: 
    my_dict[a_thing] = 0 
else: 
    my_dict[a_thing] += 1 

Очевидно, что я могу 't увеличивать запись значения, которое еще не существует. По какой-то причине у меня есть чувство (в моем неопытном мозгу, не имеющем Python), может существовать более Pythonic способ сделать это с помощью, скажем, некоторой конструкции, которая позволяет присваивать результат выражения какой-либо вещи и, если возможно, что-то else в одном заявлении.

Итак, что-то вроде этого существует в Python?

ответ

5

Это выглядит как хорошая работа для defaultdict, от collections. Обратите внимание на пример ниже:

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> d['a'] += 1 
>>> d 
defaultdict(<class 'int'>, {'a': 1}) 
>>> d['b'] += 1 
>>> d['a'] += 1 
>>> d 
defaultdict(<class 'int'>, {'b': 1, 'a': 2}) 

defaultdict будет принимать один параметр, который указывает ваше начальное значение. В этом случае вы увеличиваете целочисленные значения, поэтому вы хотите int.

В качестве альтернативы, так как вы подсчета пунктов, вы можете также (как указано в комментариях) использовать Counter, которые в конечном итоге сделать всю работу за вас:

>>> d = Counter(['a', 'b', 'a', 'c', 'a', 'b', 'c']) 
>>> d 
Counter({'a': 3, 'c': 2, 'b': 2}) 

Он также поставляется с некоторыми хорошими бонусами. Как most_common:

>>> d.most_common() 
[('a', 3), ('c', 2), ('b', 2)] 

Теперь у вас есть заказ, чтобы дать вам наиболее распространенные счетчики.

+1

Обратите внимание, что 'defaultdict (интермедиат)' в основном 'collections.Counter()' – vaultah

+0

@vaultah Да. Благодарю. Это * должно было быть первым решением, о котором я думал. Я добавил. – idjaw

1

использование get методы

>>> d = {} 
>>> d['a'] = d.get('a', 0) + 1 
>>> d 
{'a': 1} 
>>> d['b'] = d.get('b', 2) + 1 
>>> d 
{'b': 3, 'a': 1}