web-dev-qa-db-fra.com

Je ne trouve pas imap () dans les outils d'itération en Python

J'ai un problème que je veux résoudre avec itertools.imap (). Cependant, après avoir importé itertools dans IDLE Shell et appelé itertools.imap (), IDLE Shell m’a dit qu’itertools n’avait pas l’attribut imap. Qu'est-ce qui ne va pas?

>>> import itertools
>>> dir(itertools)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', '_grouper',     '_tee', '_tee_dataobject', 'accumulate', 'chain', 'combinations', 'combinations_with_replacement', 'compress', 'count', 'cycle', 'dropwhile', 'filterfalse', 'groupby', 'islice', 'permutations', 'product', 'repeat', 'starmap', 'takewhile', 'tee', 'Zip_longest']
>>> itertools.imap()
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
itertools.imap()
AttributeError: 'module' object has no attribute 'imap'
23
user3905370

itertools.imap() est en Python 2, mais pas en Python 3.

En fait, cette fonction a été déplacée uniquement dans la fonction map dans Python 3 et si vous souhaitez utiliser l'ancienne carte Python 2, vous devez utiliser list(map()).

26
markzz

Si vous voulez quelque chose qui fonctionne à la fois dans Python 3 et Python 2, vous pouvez faire quelque chose comme:

try:
    from itertools import imap
except ImportError:
    # Python 3...
    imap=map
11
dawg

Vous utilisez Python 3, il n’ya donc pas de fonction imap dans le module itertools. Il a été supprimé, car la fonction globale map renvoie maintenant des itérateurs.

6
Alik

Que dis-tu de ça?

imap = lambda *args, **kwargs: list(map(*args, **kwargs))

En réalité!! :)

import itertools
itertools.imap = lambda *args, **kwargs: list(map(*args, **kwargs))
2
Inversus

J'aime les python-future idoms pour le code universel Python 2/3, comme ceci:

# Works in both Python 2 and 3:
from builtins import map

Vous devez ensuite refactoriser votre code pour utiliser map partout où vous utilisiez imap auparavant:

myiter = map(func, myoldlist)

# `myiter` now has the correct type and is interchangeable with `imap`
assert isinstance(myiter, iter)

Vous devez installer future pour que cela fonctionne à la fois en 2 et en 3:

pip install future
1
hobs

Vous pouvez utiliser le script 2to3 ( https://docs.python.org/2/library/2to3.html ), qui fait partie de chaque installation Python pour traduire votre programme ou Projets entiers de Python 2 à Python 3.

python <path_to_python_installation>\Tools\scripts\2to3.py -w <your_file>.py

(l'option -w écrit les modifications dans le fichier, une sauvegarde est stockée)

0
user2757572