Warum funktioniert map wie izip_longest mit fill = None?

8

Wenn map Eingaben mit unterschiedlicher Länge hat, wird für die fehlenden Eingaben ein Füllwert von None verwendet:

%Vor%

Dies ist das gleiche Verhalten wie:

%Vor%

Was ist der Grund dafür, dass map dieses Verhalten und nicht das folgende bietet?

%Vor%

... und gibt es eine einfache Möglichkeit, das letztere Verhalten entweder mit einem Geschmack von zip oder map zu bekommen?

    
Mike McKerns 08.05.2015, 16:03
quelle

2 Antworten

5

Ich denke, dies ist eine Design-Entscheidung, auf die sich die Core-Entwickler zum Zeitpunkt der Implementierung von map geeinigt haben. Es gibt kein allgemein definiertes Verhalten für map , wenn es mit mehreren Iterablen verwendet wird, z. B. aus Map (höher) -Ordnungsfunktion) :

  

Karte mit 2 oder mehr Listen trifft auf das Problem der Handhabung, wenn die   Listen sind unterschiedlich lang. Verschiedene Sprachen unterscheiden sich darin; etwas   eine Ausnahme auslösen, einige nach der Länge der kürzesten Liste stoppen   und ignorieren Sie zusätzliche Elemente in den anderen Listen; einige fahren weiter zum   Länge der längsten Liste, und für die Listen, die bereits beendet sind,   Übergeben Sie einen Platzhalterwert an die Funktion, die keinen Wert angibt.

Also, Python Core Devs haben sich für None als Platzhalter für kürzere Iterables zur Zeit entschieden map wurde 1993 für Python eingeführt.

Aber im Fall von itertools.imap schließt es mit dem kürzesten iterablen kurz, da sein Design stark von Sprachen wie Standard ML, Haskell und APL inspiriert ist. In Standard ML und Haskell% endet co_de% mit dem kürzesten iterablen Wert (ich bin mir aber nicht sicher, ob APL).

Python 3 entfernte auch map (oder wir sollten sagen map(None, ...) , Python 3's itertools.imap ist eigentlich fast map : Move itertools.imap from map() to itertools ) konstruieren, weil es nur in Python 2 vorhanden war, weil zu der Zeit, als builtins zu Python hinzugefügt wurde, keine existierte map Funktion in Python.

Von Issue2186: zip() und map sollten filter nicht als erstes Argument unterstützen (nur in Py3k) :

  

Ich stimme mit Guido überein, dass wir nie None if erstellt hätten    map(None, ...) hatte existiert. Der primäre Anwendungsfall ist veraltet.

Um das gewünschte Ergebnis zu erhalten, würde ich vorschlagen, zip() mit einem Sentinel-Wert ( itertools.izip_longest ) anstelle von default object() zu verwenden, None bricht Dinge, wenn die iterablen selbst None enthalten:

%Vor%     
Ashwini Chaudhary 08.05.2015, 17:35
quelle
1

Da die erste Liste immer länger ist und es nur zwei Listen gibt, würden Sie so etwas tun:

%Vor%     
Josep Valls 08.05.2015 16:43
quelle

Tags und Links