Следующие два выражения кажутся мне похожими. Какой из них предпочтительнее?
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, хотя ее сложнее понять для неопытных, быстрее и, следовательно, предпочтительнее. Мнения?