Объект типа ‘map’ не имеет функции len() в Python 3

#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 действительно будет содержать конечное число элементов.