2011-11-09 2 views
3

La signature pour map estComment puis-je obtenir la fonctionnalité Python2.x `map` dans Python3.x?

map(function, iterable[, iterables[, ...]]) 

En Python 2.x si function est l'identité None suppose, et iterables courts sont rembourrés avec « Aucun » pour la durée de la plus longue itérables.

3.x Python si function est None vous obtenez finalement une exception:

TypeError: 'NoneType' object is not callable 

et tous iterables rognées à la longueur de la plus courte.

C'est un couple de changements assez drastiques. Comment puis-je récupérer la sémantique 2.x? Oh, et il retourne maintenant un itérateur au lieu d'une liste, mais je suis d'accord avec ce changement. ;)


Ceci est utile pour les cas où vous ne savez pas à l'avance quelle fonction, le cas échéant, sera appliquée - juste parce que vous n'êtes pas transformez en fait la itérables ne signifie pas que vous n Je ne veux pas son contenu.

+0

Notez que cela n'a rien à voir avec de la fonction est "None" ou pas. Vous n'avez pas "finalement" l'erreur, vous l'obtenez la première fois. Vous ne pouvez simplement pas passer à None. Le problème est que map() dans Python 3 s'arrêtera à l'itération la plus courte. Je ne suis pas sûr de savoir pourquoi ce changement a été fait. –

Répondre

5

Vous devez rouler votre propre - mais il est facile:

from itertools import zip_longest, starmap 

def map2x(func, *iterables): 
    zipped = zip_longest(*iterables) 
    if func is None: 
     return zipped 
    return starmap(func, zipped) 

Un exemple simple:

a=['a1'] 
b=['b1','b2','b3'] 
c=['c1','c2'] 

print(list(map2x(None, a, b, c))) 

qui nous donne:

[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)] 
+0

Je ne suis pas d'accord avec les fonctions internes importées (sauf 'from ... import *' - ce n'est vraiment pas bon, et pas autorisé dans Python 3.x), mais j'aime vos autres améliorations. Merci! –

+0

@EthanFurman: Cela ne devrait vraiment être fait que pour éviter les importations circulaires, ou si vous avez des modules qui se comportent mal que vous ne voulez importer que si vous en avez vraiment besoin. Sinon, il ralentit et encombre le code. –

Questions connexes