Список, возвращаемый функцией 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) 
  • Группы в регулярных выражениях
  • Понимание time.perf_counter () и time.process_time ()
  • unicode_literals и type ()
  • Если утверждение не сравнивается должным образом
  • «TypeError: строковый аргумент без кодировки», но строка закодирована?
  • Как установить порядок вкладок в приложении tkinter?
  • Как открыть и представить исходные двоичные данные в Python?
  • Использование нескольких версий Python
  • Почему мои лямбды не работают?
  • Ошибка установки PyCrypto в Windows
  • Запрос и ответ Python http.client json. Как?
  •  
    Interesting Posts for Van-Lav

    Почему функция numpy einsum работает быстрее, чем встроенные функции numpy?

    Как искать список, который находится во вложенном списке (список списка) без цикла в Python?

    Поиск максимальных кликов и удаление узлов?

    Ошибка импорта Python: «Нет модуля с именем» существует

    Как округлить до определенных значений в Python

    Ошибка внутреннего сервера при использовании Python OpenId с аутентификацией Google

    Могу ли я писать собственный iPhone, Android, Windows, BlackBerry приложения с помощью Python?

    Группировка с использованием itertools.groupby

    Как я могу построить таблицу sqlite из этого файла xml / txt с помощью python?

    Что такое мастер-режим uWSGI?

    Ошибка импорта scipy.linalg в windows (python 3.3)

    Быстрые циклы Numpy

    Переупорядочить список точек для достижения кратчайшего расстояния между ними

    Ошибка ядра с Anaconda (Python 2.7) для Windows 10. Ошибка консоли IDE Spyder

    Частичный экстракт регулярного выражения Python

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