Код: Выделить всё
data = [('a', 1), ('b', 1), ('b', 2)]
d1 = {}
d2 = {}
for key, val in data:
# variant 1)
d1[key] = d1.get(key, []) + [val]
# variant 2)
d2.setdefault(key, []).append(val)
Лично я нахожу версию 2 сложнее понять, так как для меня setdefault очень сложно понять. Если я правильно понимаю, он ищет значение «ключа» в словаре, если оно недоступно, вводит «[]» в dict, возвращает ссылку либо на значение, либо на «[]» и добавляет к этому «val». ссылка. Несмотря на то, что она, безусловно, гладкая, она ни в коей мере не интуитивно понятна (по крайней мере, для меня).
На мой взгляд, версию 1 легче понять (если она доступна, получите значение для «ключ», если нет, получите «[]», затем присоединитесь к списку, составленному из [val], и поместите результат в «ключ»). Но хотя эта версия более интуитивно понятна, я боюсь, что эта версия менее производительна из-за создания всего этого списка. Другим недостатком является то, что «d1» встречается в выражении дважды, что весьма подвержено ошибкам. Вероятно, есть лучшая реализация с использованием get, но в настоящее время она ускользает от меня.
Я предполагаю, что версия 2, хотя и более сложна для понимания неопытным, но быстрее и, следовательно, предпочтительнее. Мнения?
Подробнее здесь: https://stackoverflow.com/questions/742 ... setdefault
Мобильная версия