Подтвердить что ты не робот

импорт izip из модуля itertools дает NameError в Python 3.x

Я пытаюсь импортировать модуль izip следующим образом:

from itertools import izip

Однако после перехода с Python 2.7 на 3 - это, похоже, не работает.

Я пытаюсь записать файл csv:

writer.writerows(izip(variable1,2))

Но мне не повезло. Все еще встречайте ошибку.

4b9b3361

Ответ 1

В Python 3 встроенный zip выполняет ту же работу, что и itertools.izip в 2.X (возвращает итератор вместо списка). Реализация zip почти полностью вставлена в копию из старого izip, только с несколькими измененными именами и добавлена поддержка pickle.

Вот тест между zip в Python 2 и 3 и izip в Python 2:

Python 2.7:

from timeit import timeit

print(timeit('list(izip(xrange(100), xrange(100)))',
             'from itertools import izip',
             number=500000))

print(timeit('zip(xrange(100), xrange(100))', number=500000))

Выход:

1.9288790226
1.2828938961

Python 3:

from timeit import timeit

print(timeit('list(zip(range(100), range(100)))', number=500000))

Выход:

1.7653984297066927

В этом случае, поскольку аргументы zip должны поддерживать итерацию, вы не можете использовать 2 в качестве аргумента. Поэтому, если вы хотите записать 2 переменные в виде строки CSV, вы можете поместить их в кортеж или список:

writer.writerows((variable1,2))

Также из itertools вы можете импортировать zip_longest в качестве более гибкой функции, которую вы можете использовать на итераторах с другим размером.

Ответ 2

Один из способов, который помог мне это:

try:
    from itertools import izip as zip
except ImportError: # will be 3.x series
    pass

Ответ 3

Используйте zip вместо izip непосредственно в Python 3, не нужно ничего импортировать.

Для дальнейшего визита сюда.