Недавно я нашел и начал использовать словари по умолчанию для замены еще нескольких громоздких конструкций. Я читал в «дзен питона», что одним из ключевых моментов питона является «Должен быть один — и желательно только один — очевидный способ сделать это».
Основываясь на этих критериях (или, возможно, более практично на основе использования памяти или скорости), какой из следующих (или что-то совершенно другое) будет лучшим? У меня есть предчувствие, что первое верно, но хотелось бы узнать мнение других людей.
my_dict = defaultdict(int)
for generic in iterable:
my_dict[generic] +=1
or:
my_dict = {}
for generic in iterable:
if generic not in my_dict:
my_dict[generic] = 1
else:
my_dict[generic]+=1
or:
my_dict = {}
for generic in iterable:
try:
my_dict[generic] += 1
except(KeyError):
my_dict[generic] = 1
То же самое можно сказать об использовании my_dict = defaultdict(list) и использовании функций добавления. Предположим, что используются несколько циклов for или другие условные выражения, а не просто подсчет общих значений из одной итерации, поскольку это, очевидно, будет иметь разные функции.
defaultdict
- лучший из трех, но, как сказал @PauloAlmeida, лучше использоватьCounter
, если вы используете только целые числа. Используйтеdefaultdict
, когда вы действительно хотите вызывать методы типа по умолчаниюd=defaultdict(list); d[0].extend([1,2,3])
и т. д. - person ejrb   schedule 18.12.2013