Список, возвращаемый функцией map, исчезает после одного использования

Я новичок в Python. Я использую Python 3.3.2, и мне сложно понять, почему следующий код:

strList = ['1','2','3'] intList = map(int,strList) largest = max(intList) smallest = min(intList) 

Дает мне эту ошибку:

 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: min() arg is an empty sequence 

Однако этот код:

 strList = ['1','2','3'] intList = list(map(int,strList)) largest = max(intList) smallest = min(intList) 

Не дает мне никаких ошибок.

Моя мысль заключается в том, что когда intList присваивается возвращаемому значению функции map, он становится итератором, а не списком, как в документах . И, возможно, как побочный эффект вызова max() , итератор был итерирован до конца списка, заставляя Python полагать, что список пуст (я рисую из знания C здесь, я не знаком с тем, как итераторы действительно работаю на Python.) Единственное доказательство, которое я должен поддержать, это то, что для первого блока кода:

 >>> type(intList) <class 'map'> 

тогда как для второго блока кода:

 >>> type(intList) <class 'list'> 

Может кто-нибудь подтвердить или опровергнуть это для меня, пожалуйста?

2 Solutions collect form web for “Список, возвращаемый функцией map, исчезает после одного использования”

Вы точно верны. В Python 3 map возвращает итератор, который вы можете перебирать только один раз. Если вы повторите итератор во втором случае, он немедленно вызовет StopIteration , как будто он пуст. max потребляет все это, а min видит, что итератор пуст. Если вам нужно использовать элементы более одного раза, вам нужно вызвать list чтобы получить список вместо итератора.

из вашей map документации:

Верните итератор, который применяет функцию к каждому элементу итерации, давая результаты.

и из http://docs.python.org/3/library/stdtypes.html#typeiter

Когда метод next () метода iterator вызывает StopIteration, он должен продолжать делать это при последующих вызовах.

Таким образом, итератор, независимо от базового объекта данных, может использоваться только один раз. Он основывается на концепции генератора.

itertools.tee можно использовать для создания нескольких независимых итераторов.

 l1,l2 = itertools.tee(intList,2) max(l1) min(l2) 
  • Ошибка Hmac Hashing в Python 3.5
  • python random.setstate (), seed () - есть ли гарантия одинаковых результатов в реализациях?
  • Сортировка списка кортежей кортежей
  • Создайте mptches matplotlib с прямоугольником двухцветного для легенды фигур
  • Строковые подстановки на основе объекта-сопоставления (Python)
  • Странное поведение в Python 3 с использованием модуля sys
  • Python3 AttributeError: объект 'list' не имеет атрибута 'clear'
  • Удалите NaN 'Cells', не отбрасывая всю ROW (Pandas, Python3)
  •  
    Interesting Posts for Van-Lav

    django развертывание отдельных веб-сайтов и api-endpoints на герою

    Библиотека или инструмент для загрузки нескольких файлов параллельно

    Python: как вы создаете массив с информацией о каждом пикселе из изображения?

    Солить обе переменные класса и переменные экземпляра?

    Как разработать модуль / пакет Python без необходимости перезапуска интерпретатора после каждого изменения?

    Токсифицируйте абзац в предложении, а затем в словах в NLTK

    Как снизить IPython4 до 3 с помощью Anaconda

    Не удалось найти версию, удовлетворяющую требованию pytz

    Python: преобразование строки в метку времени с помощью микросекунд

    Как ускорить фрактальную генерацию с помощью массивов numpy?

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

    Преобразование изображения PIL в GTK Pixbuf

    ipython Pandas: Как я могу сравнить разные строки одного столбца с метрикой расстояния Левенштейна?

    Я ищу gevent для Python 2.7 для окон

    Графический график Matplotlib от значений в pandas DataFrame

    Python - лучший язык программирования в мире.