Автоматическое изменение defaultdict (python 3) - PullRequest
0 голосов
/ 30 мая 2018

Я столкнулся с проблемой при переводе с python2 на python3 следующей строки:

fmap = defaultdict(count(1).next)

Я изменил count(1).next на next(count(1))

, но получил эту ошибку:

fmap = defaultdict (next (count (1))) TypeError: первый аргумент должен быть вызван или отсутствует

Я предполагаю, что эта строка намеревается присвоить новое значение по умолчанию каждый раз.Есть ли у вас предложения?Спасибо

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Метод .next() на итераторах был переименован в Python 3. Вместо этого используйте .__next__().

Код

fmap = defaultdict(count(1).__next__)

Демо

fmap["a"]
# 1

fmap["b"]
# 2

Заметьте, defaultdict нужен аргумент, который можно вызывать, что-то, что будет действовать как функция, поэтому скобки удаляются, например, __next__.

0 голосов
/ 30 мая 2018

Ошибка ясна - первый аргумент defaultdict должен быть вызываемым (например, функция или имя класса) или None.Этот вызываемый объект будет вызываться в случае, если не существует ключа для создания хранилища по умолчанию.С другой стороны:

next(count(3))

вернет целое число, которое не вызывается и не имеет смысла.Если вы хотите, чтобы defaultdict по умолчанию увеличивало число при использовании отсутствующего ключа, то что-то похожее на то, что у вас есть:

>>> x=defaultdict(lambda x=count(30): next(x))
>>> x[1]
30
>>> x[2]
31
>>> x[3]
32
>>> x[4]
33
...