Python 3 vs Python 2 Kartenverhalten

In Python 2 ist ein allgemeines (altes, altes) Idiom zu verwendenmap um Iteratoren ungleicher Länge mit dem Formular zu verbindenmap(None,iter,iter,...) wie so:

>>> map(None,xrange(5),xrange(10,12))
[(0, 10), (1, 11), (2, None), (3, None), (4, None)]

In Python 2 wird es so erweitert, dass dieam längsten Der Iterator ist die Länge der zurückgegebenen Liste. Wenn eine Liste kürzer als die andere ist, wird sie aufgefülltNone.

In Python 3 ist dies anders. Erstens können Sie nicht verwendenNone als Argument für das aufrufbare in Position 1:

>>> list(map(None, range(5),range(10,12)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

OK - das kann ich so beheben:

>>> def f(*x): return x    
... 
>>> list(map(f, *(range(5),range(10,12))))
[(0, 10), (1, 11)]

Aber jetzt habe ich ein anderes Problem:map gibt das zurückkürzeste Iteratorlänge - nicht mehr gepolstert mitNone.

Da ich Python 2-Code nach Python 3 portiere, ist dies keine schrecklich seltene Redewendung, und ich habe keine einfache Lösung gefunden.

Leider sind die 2to3-Toolsnicht nimm das auf - unhöflich was andeutet:

-map(None,xrange(5),xrange(10,18))
+list(map(None,list(range(5)),list(range(10,18)))) 

Vorschläge?

Bearbeiten

Es wird diskutiert, wie verbreitet diese Redewendung ist.Siehe diesen SO-Beitrag.

Ich aktualisiere den geschriebenen Legacy-Codeals ich noch in der High School war. Schauen Sie sich die 2003 Python-Tutorials angeschrieben und diskutiert von Raymond Hettinger mit diesem spezifischen Verhalten der Karte wird darauf hingewiesen ...

Antworten auf die Frage(3)

Ihre Antwort auf die Frage