#python
#python #python-3.x #переменная длина
Вопрос:
У меня проблема с Python 3. Я получил код на Python 2.7 и в данный момент пытаюсь его обновить. Я получаю сообщение об ошибке:
Ошибка типа: объект типа ‘map’ не имеет функции len()
в этой части:
str(len(seed_candidates))
Прежде чем я инициализировал его следующим образом:
seed_candidates = map(modify_word, wordlist)
Итак, кто-нибудь может объяснить мне, что я должен делать?
(РЕДАКТИРОВАТЬ: Ранее этот пример кода был неправильным, потому что он использовал set
вместо map
. Сейчас она была обновлена.)
Комментарии:
1. У меня это работает. Опубликуйте полный пример, демонстрирующий проблему. Вы даже не вызывали
map
нигде в приведенном выше коде.2. На данный момент это лучший результат от Google, и в текущем вопросе на самом деле нет отличного примера
map
, поэтому я собираюсь несколько радикально отредактировать вопрос и изменить код, который изначально был в OP. Я полагаю, что OP что-то пропустил, когда вопрос был впервые задан два года назад. Не стесняйтесь возвращаться, если кто-нибудь возражает
Ответ №1:
В Python 3 map
возвращает объект map, а не list
:
>>> L = map(str, range(10))
>>> print(L)
<map object at 0x101bda358>
>>> print(len(L))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'map' has no len()
Вы можете преобразовать его в список, а затем получить оттуда длину:
>>> print(len(list(L)))
10
Комментарии:
1. Я думаю, что для этого есть канонический вопрос / ответ. Приведенный выше вопрос является дубликатом.
2. Я думаю, что list (L) заставит итератор выполняться до конца, и это приведет к тому, что этот итератор больше не будет полезен (если вы специально не воспроизведете этот итератор)
Ответ №2:
Хотя принятый ответ может сработать для OP, здесь есть чему поучиться, потому что иногда вы не можете найти длину, даже при map(modify_word, wordlist)
приведении OP в list и проверке длины с помощью len(list(map(modify_word, wordlist)))
. Вы не можете, потому что иногда длина бесконечна.
Например, давайте рассмотрим следующий генератор, который лениво вычисляет все натуральные:
def naturals():
num = 0
while True:
yield num
num =1
И, допустим, я хочу получить квадрат каждого из них, то есть,
doubles = map(lambda x: x**2, naturals())
Обратите внимание, что это полностью законное использование функции map, и оно будет работать, и позволит вам использовать функцию next() для doubles
переменной:
>>> doubles = map(lambda x: x**2, naturals())
>>> next(doubles)
0
>>> next(doubles)
1
>>> next(doubles)
4
>>> next(doubles)
9
...
Но что, если мы попытаемся преобразовать его в список? Очевидно, что python не может знать, пытаемся ли мы выполнить итерацию через бесконечный итератор. Итак, если мы попытаемся привести экземпляр этого MapObject к списку, python будет пытаться и продолжать пытаться и застрянет в бесконечном цикле.
Поэтому, когда вы выполняете приведение к list, вы должны сначала убедиться, что вы знаете, что ваш объект map действительно будет содержать конечное число элементов.