Более идиоматический способ заполнить словарь в Python

В настоящее время я пытаюсь заполнить словарь на Python, но я думаю, что то, что я делаю, немного избыточно. Есть ли более питонический способ сделать следующее:

if not pattern_file_map.get(which_match):
    pattern_file_map[which_match] = [line]
else:
    pattern_file_map[which_match].append(line)

где pattern_file_map — словарь.

Я знаю, что есть определенная идиома, которую можно использовать при проверке наличия ключа в словаре, например этот вопрос, но я просто хочу заполнить этот словарь списками.


person Jeffrey Greenham    schedule 21.06.2012    source источник


Ответы (3)


Вы могли бы использовать

pattern_file_map.setdefault(which_match, []).append(line)

вместо.

Другие люди могут предложить вместо этого использовать collections.defaultdict(list), что является еще одним вариантом, но имейте в виду, что это может скрыть ошибки, поскольку он автоматически создаст все ключи, к которым вы получаете доступ.

person Sven Marnach    schedule 21.06.2012
comment
Вы можете сделать так, чтобы defaultdict действовал как обычный словарь, установив для его атрибута default_factory значение None (что сделает код немного уродливее). - person Steven Rumbalski; 21.06.2012
comment
@StevenRumbalski: Хороший вопрос. (Обратите внимание, что я совсем не против использования defaultdict.) - person Sven Marnach; 21.06.2012

Вы можете попробовать использовать collections.defaultdict.

person seandavi    schedule 21.06.2012

Поскольку вы добавляете к возможно существующему значению:

pattern_file_map.setdefault(which_match, []).append(line)

При использовании dict.get():

li = pattern_file_map.get(which_match, [])
li.append(line)
pattern_file_map[which_match] = li

Конечно, оба случая ограничены случаем, когда значения вашего dict являются списками.

person Nisan.H    schedule 21.06.2012
comment
В чем разница между: pattern_file_map.get(what_match, []) и pattern_file_map.setdefault(what_match, [])? - person Jeffrey Greenham; 21.06.2012
comment
.get(key,default) возвращает значение или значение по умолчанию (без настройки) и требует присвоения обратно в словарь. .setdefault(key,default) в этом случае лучше. Я исправил свой ответ. - person Nisan.H; 21.06.2012