LINUX.ORG.RU

python: поясните применение метода setdefault() для словаря

 ,


1

1

Видел вот такой код:

s = ['a','b','c','d','a','a','a','b','c','b','b','b']

X = {}

for i in range(len(s)-1):
    X.setdefault((s[i], s[i+1]), [0])[0] += 1

Т.е. идем по списку и считаем переходы, a->b, b->c, c->c и так далее. Какя понимаю, setdefault() добавит значение по умолчанию, если ключ отсутствует в словаре. Но я не понимаю, почему default value список, в данном случае из одного элемента [0].

В чем необходимость использовать список в качестве счетчика, почему нельзя напрямую использовать целое для хранения? Например, вот такое тоже работает:

for i in range(len(states)-1):
   M.setdefault((states[i], states[i+1]), 0)
   M[(states[i], states[i+1])] += 1

Спасибо.

★★

При такой постановке задачи никакого смысла нет.

Но, мб дальше в коде какой-то смыл появляется. Если нет, то быдлокода в мире полно, удивляться тут нечему.

WitcherGeralt ★★ ()
Ответ на: комментарий от cruz7

Чтобы передавать список в качестве ссылки? Даже если так в большинстве случаев это будет быдлокодом.

И смысл гадать, если у тебя код есть, передаётся оно куда-то или нет?

WitcherGeralt ★★ ()

Т.е. ты даже переписал в 2 строчки вместо одной (т.к. X.setdefault((s[i], s[i+1]), 0) += 1 не работало), но так и не понял почему нужен список?

anonymous ()
Ответ на: комментарий от cruz7

Может быть, это как-то связано с references в питоне?

Штирлиц шел по берегу Шпреи и увидел сидящего с удочкой чело- века. «Как клюет?» - спросил Штирлиц. «Хорошо,» - ответил чело- век. «Рыболов,» - догадался Штирлиц.

anonymous ()
Ответ на: комментарий от anonymous

Почему чужое недоумение от быдлокода вызывает недоумение у тебя?

Ну хочешь одну строчку, не проблема:

from collections import defaultdict

d = defaultdict(int)
d['x'] += 1


При условии, что автор кода понимал, что делает, мне тоже не понятно зачем там список.

WitcherGeralt ★★ ()
Ответ на: комментарий от WitcherGeralt

Он думает, что создадутся ключи с значениями по умолчанию. Так пусть и создает ключи ))

dem ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.