Ich versuche, eine Liste hexadezimal zuzuordnen und die Liste dann an anderer Stelle zu verwenden. In Python 2.6 war dies einfach:
A: Python 2.6:
>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']
In Python 3.1 gibt das Obige jedoch ein Kartenobjekt zurück.
B: Python 3.1:
>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>
Wie rufe ich die zugeordnete Liste (wie in A oben) unter Python 3.x ab?
Gibt es alternativ einen besseren Weg, dies zu tun? Mein anfängliches Listenobjekt enthält ungefähr 45 Elemente und die ID möchte sie in hexadezimal konvertieren.
python
list
python-3.x
map-function
Mozami
quelle
quelle
map()
wurde fast aus der Sprache entfernt, weil es keinen Grund gibt, sie über ein Listenverständnis oder einefor
Schleife zu verwenden.Antworten:
Mach das:
In Python 3+ geben viele Prozesse, die über Iterables iterieren, Iteratoren selbst zurück. In den meisten Fällen wird dadurch Speicherplatz gespart, und die Dinge sollten schneller laufen.
Wenn Sie diese Liste nur noch durchlaufen möchten, müssen Sie sie nicht einmal in eine Liste konvertieren, da Sie das
map
Objekt dennoch wie folgt durchlaufen können :quelle
map
wäre eine verzögerte Auswertung, wenn eine komplexe Funktion, große Datenmengen oder Streams durchlaufen werden .bytes(sequence_of_ints_in_range_0_to_256).decode('latin-1')
die eine machtstr
durch die Vermeidung von für jedes Element für eine Bulk - Konvertierung Funktionsaufrufe Python schneller von Alle Elemente, die nur Funktionsaufrufe der Ebene C verwenden. Sie können das Obige einschließen,list
wenn Sie wirklich eineslist
der einzelnen Zeichen benötigen. Dastr
es sich jedoch bereits um eine Iteration seiner eigenen Zeichen handelt, ist der einzige Grund, warum Sie dies tun würden, wenn Sie eine Veränderbarkeit benötigen.Neu und ordentlich in Python 3.5:
Dank zusätzlicher Verpackungsverallgemeinerungen
AKTUALISIEREN
Immer auf der Suche nach kürzeren Wegen, entdeckte ich, dass dieser auch funktioniert:
Das Auspacken funktioniert auch in Tupeln. Beachten Sie das Komma am Ende. Dies macht es zu einem Tupel von 1 Element. Das heißt, es ist gleichbedeutend mit
(*map(chr, [66, 53, 0, 94]),)
Es ist nur um ein Zeichen kürzer als die Version mit den Listenklammern, aber meiner Meinung nach ist es besser zu schreiben, weil Sie direkt mit dem Sternchen beginnen - der Erweiterungssyntax, also denke ich, dass es im Kopf weicher ist. :) :)
quelle
list()
sieht nicht so ordentlich auslist
Konstruktor nicht nachgeschlagen und allgemeine Funktionsaufrufmaschinen aufgerufen werden müssen. Für eine lange Eingabe spielt es keine Rolle; Für einen kurzen Fall kann es einen großen Unterschied machen. Wenn Sie den obigen Code mit der Eingabe als verwenden,tuple
damit diese nicht wiederholt rekonstruiert wird,ipython
zeigen Mikrobenchmarks, dass derlist()
Wrapping-Ansatz etwa 20% länger dauert als das Entpacken. In absoluten Zahlen sprechen wir von 150 ns, was trivial ist, aber Sie haben die Idee.map
? Vielleicht mit einem neuen Namen (lmap
?), Wenn der neue Standard darin besteht, einen Iterator zurückzugeben?*map()
gibt Syntaxfehler anPython 3.6
:can't use starred expression here
. Sie müssen es in ein setzenlist
:[ *map() ]
Warum machst du das nicht:
Es heißt Listenverständnis. Sie finden viele Informationen bei Google, aber hier ist der Link zur Python (2.6) -Dokumentation zum Listenverständnis . Die Python 3-Dokumentation könnte Sie jedoch mehr interessieren .
quelle
map(chr, [66,53,0,94])
ist definitiv prägnanter als[chr(x) for x in [66,53,0,94]]
.Die Listenrückgabe-Kartenfunktion hat den Vorteil, dass die Eingabe gespeichert wird, insbesondere während interaktiver Sitzungen. Sie können eine
lmap
Funktion definieren (in Analogie zu Python2imap
), die eine Liste zurückgibt:Dann erledigt das Anrufen
lmap
anstelle vonmap
den Job:lmap(str, x)
ist um 5 Zeichen kürzer (in diesem Fall 30%) alslist(map(str, x))
und sicherlich kürzer als[str(v) for v in x]
. Sie können ähnliche Funktionen auch für erstellenfilter
.Es gab einen Kommentar zur ursprünglichen Frage:
Das ist möglich, aber es ist eine sehr schlechte Idee. Nur zum Spaß, hier ist, wie Sie es tun können ( aber nicht sollten ):
quelle
Konvertieren meines alten Kommentars für eine bessere Sichtbarkeit: Für einen "besseren Weg, dies zu tun" ohne
map
vollständig, wenn Ihre Eingaben als ASCII-Ordnungszahlen bekannt sind, ist es im Allgemeinen viel schnellerbytes
, a la zu konvertieren und zu dekodierenbytes(list_of_ordinals).decode('ascii')
. Das bringt Ihnen einenstr
der Werte, aber wenn Sie einenlist
für Veränderlichkeit oder ähnliches benötigen , können Sie ihn einfach konvertieren (und er ist immer noch schneller). Zum Beispiel inipython
Mikrobenchmarks, die 45 Eingänge konvertieren:Wenn Sie es als belassen
str
, dauert es ~ 20% der Zeit der schnellstenmap
Lösungen; Selbst wenn Sie zurück zur Liste konvertieren, sind es immer noch weniger als 40% der schnellstenmap
Lösung. Die Massenkonvertierung überbytes
undbytes.decode
dann die Massenkonvertierung zurück inlist
spart viel Arbeit, funktioniert jedoch, wie bereits erwähnt, nur, wenn alle Ihre Eingaben ASCII-Ordnungszahlen sind (oder Ordnungszahlen in einem Gebietsschema für ein Byte pro Zeichen, zlatin-1
. B. spezifische Codierung ).quelle
bedeutet, dass ein Iterator zurückgegeben wird.
bedeutet, dass die next () -Funktion des Iterators einen Wert jeder Iterable nimmt und jede von ihnen an einen Positionsparameter der Funktion übergibt.
Sie erhalten also einen Iterator von der Funktion map () und übergeben ihn einfach an die integrierte Funktion list () oder verwenden Listenverständnisse.
quelle
Zusätzlich zu den obigen Antworten in
Python 3
können wir einfach einenlist
der Ergebniswerte aus einemmap
as erstellenWir können durch ein anderes Beispiel verallgemeinern, in dem ich getroffen wurde. Operationen auf der Karte können auch auf ähnliche Weise wie im
regex
Problem behandelt werden. Wir können eine Funktion schreiben, umlist
Elemente auf die Karte zu erhalten und gleichzeitig die Ergebnismenge zu erhalten . Ex.quelle
Sie können versuchen, eine Liste aus dem Kartenobjekt abzurufen, indem Sie einfach jedes Element im Objekt iterieren und in einer anderen Variablen speichern.
quelle
Mit dem Listenverständnis in Python und dem grundlegenden Dienstprogramm für Kartenfunktionen können Sie dies auch tun:
chi = [x for x in map(chr,[66,53,0,94])]
quelle