Следующие два выражения кажутся эквивалентными мне. Какой из них предпочтительнее?
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)
Результаты одинаковы, но какая версия лучше или скорее больше Pythonic?
Лично я нахожу версию 2 труднее понять, как мне SetDefault очень сложно понять. Если я правильно понимаю, это ищет значение «ключ «В словаре, если он не доступен, входит в« [] »в Dict, возвращает ссылку на значение или« [[] »и добавляет« val »к этой ссылке. В то время как, безусловно, плача, это не интуитивно понятно ( По крайней мере для меня).
На мой взгляд, версия 1 легче понять (если доступно, получить значение для «ключа», если нет, получить «[]», затем присоединитесь со списком, состоит из [val ] и поместите результат в «ключевую»). Но в то время как более интуитивно понял, я боюсь, что эта версия меньше исполнена, со всем этим списком создание. Другим недостатком заключается в том, что «D1» происходит дважды в выражении, которое довольно подвержено ошибкам. Отказ Вероятно, есть лучшая реализация, используя Get, но в настоящее время она ускользает от меня.
Я предполагаю, что версия 2, хотя и сложнее понять на неопытную, является быстрее и поэтому предпочтительнее. Мнения?