Python Dict: Get VS SetDefault

Следующие два выражения кажутся эквивалентными мне. Какой из них предпочтительнее?

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

46
задан Steve 4 November 2015 в 17:07
поделиться