Ich versuche, eine Liste in ein Hex-Feld zu mappen und dann die Liste an anderer Stelle zu verwenden. In Python 2.6 war das einfach:
A: Python 2.6:
>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']
In Python 3.1 wird jedoch ein Kartenobjekt zurückgegeben.
B: Python 3.1:
>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>
Wie rufe ich die zugeordnete Liste (wie inAoben) auf Python 3.x ab?
Gibt es alternativ einen besseren Weg, dies zu tun? Mein anfängliches Listenobjekt hat etwa 45 Elemente und die ID konvertiert sie gerne in ein Hex-Feld.
Mach das:
list(map(chr,[66,53,0,94]))
In Python 3+ geben viele Prozesse, die iterierbare Elemente durchlaufen, 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 einmal durchlaufen müssen, müssen Sie sie nicht einmal in eine Liste konvertieren, da Sie das Objekt map
immer noch so durchlaufen können:
# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
print(ch)
Warum machst du das nicht:
[chr(x) for x in [66,53,0,94]]
Es wird Listenverständnis genannt. Sie finden viele Informationen bei Google, aber hier ist der Link zur Python (2.6) -Dokumentation zu Listenkonflikte Möglicherweise interessieren Sie sich jedoch mehr für die Python 3-Dokumentation .
Neu und ordentlich in Python 3.5:
[*map(chr, [66, 53, 0, 94])]
Dank Zusätzliche Auspacken-Generalisierungen
UPDATE
Immer auf der Suche nach kürzeren Wegen entdeckte ich, dass dieser auch funktioniert:
*map(chr, [66, 53, 0, 94]),
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 entspricht (*map(chr, [66, 53, 0, 94]),)
Es ist zwar um nur ein Zeichen aus der Version mit den List-Klammern kürzer, aber meiner Meinung nach besser zu schreiben, da Sie mit dem Sternchen beginnen - der Erweiterungssyntax. :)
Die Kartenfunktion mit Listenrückgabe hat den Vorteil, dass Sie die Eingabe speichern können, insbesondere während interaktiver Sitzungen. Sie können die Funktion lmap
definieren (analog zu imap
in python2), die die Liste zurückgibt:
lmap = lambda func, *iterable: list(map(func, *iterable))
Dann wird lmap
anstelle von map
aufgerufen: lmap(str, x)
ist um 5 Zeichen kürzer (in diesem Fall 30%) als list(map(str, x))
und ist sicherlich kürzer als [str(v) for v in x]
. Sie können ähnliche Funktionen auch für filter
erstellen.
Zu der ursprünglichen Frage gab es einen Kommentar:
Ich würde eine Umbenennung in Getting map () vorschlagen, um eine Liste in Python 3. * zurückzugeben, wie es für alle Python3-Versionen gilt. Gibt es eine Möglichkeit, dies zu tun? : 58
Es ist ist möglich, das zu tun, aber es ist eine sehr schlechte Idee. Nur zum Spaß, hier ist, wie Sie es tun können (aber nicht sollten):
__global_map = map #keep reference to the original map
lmap = lambda func, *iterable: list(__global_map(func, *iterable)) # using "map" here will cause infinite recursion
map = lmap
x = [1, 2, 3]
map(str, x) #test
map = __global_map #restore the original map and don't do that again
map(str, x) #iterator
Ich bin nicht mit Python 3.1 vertraut, aber wird dies funktionieren?
[chr(x) for x in [66, 53, 0, 94]]
meinen alten Kommentar für eine bessere Sichtbarkeit konvertieren: Für eine "bessere Möglichkeit, dies zu tun", ohne map
vollständig, wenn Ihre Eingaben als ASCII - Ordnungszahlen bekannt sind, ist es im Allgemeinen viel schneller, bytes
zu konvertieren und zu decodieren. a la bytes(list_of_ordinals).decode('ascii')
. Damit erhalten Sie eine str
der Werte, aber wenn Sie eine list
für die Veränderlichkeit oder ähnliches benötigen, können Sie sie einfach konvertieren (und sie ist noch schneller). In ipython
können beispielsweise Mikrobenchmarks 45 Eingänge konvertieren:
>>> %%timeit -r5 ordinals = list(range(45))
... list(map(chr, ordinals))
...
3.91 µs ± 60.2 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)
>>> %%timeit -r5 ordinals = list(range(45))
... [*map(chr, ordinals)]
...
3.84 µs ± 219 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)
>>> %%timeit -r5 ordinals = list(range(45))
... [*bytes(ordinals).decode('ascii')]
...
1.43 µs ± 49.7 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)
>>> %%timeit -r5 ordinals = list(range(45))
... bytes(ordinals).decode('ascii')
...
781 ns ± 15.9 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)
Wenn Sie es als str
belassen, dauert es ~ 20% der Zeit der schnellsten map
-Lösungen. selbst wenn Sie die Liste wieder in die Liste umwandeln, sind es noch weniger als 40% der schnellsten map
-Lösung. Massenkonvertierung über bytes
und bytes.decode
und Massenkonvertierung zurück nach list
spart eine Menge Arbeit, aber funktioniert nur, wenn alle Ihre Eingaben ASCII - Ordinalzahlen (oder Ordinalzahlen in einem bestimmten Byte für ein Gebietsschema) sind Kodierung, zB latin-1
).
Mit dem Listenverständnis in python und dem grundlegenden Kartenfunktionsdienstprogramm kann man dies auch tun:
chi = [x for x in map(chr,[66,53,0,94])]
list(map(chr, [66, 53, 0, 94]))
map (func, * iterables) -> Kartenobjekt Erstellen Sie einen Iterator, der die Funktion mithilfe von Argumenten aus .__ berechnet. jedes der iterables. Hält an, wenn der kürzeste Iterer erschöpft ist.
"Machen Sie einen Iterator"
bedeutet, dass ein Iterator zurückgegeben wird.
"das berechnet die Funktion unter Verwendung von Argumenten aus jedem der iterables"
bedeutet, dass die next () - Funktion des Iterators einen Wert von jeder iterierbaren Funktion übernimmt und jeden von ihnen an einen Positionsparameter der Funktion übergibt.
Sie erhalten also einen Iterator von der map () - Funktion und geben ihn an die list () - eingebaute Funktion weiter oder verwenden Listen-Auffassungen.
Zusätzlich zu den obigen Antworten in Python 3
können wir einfach eine list
von Ergebniswerten aus einer map
as erstellen
li = []
for x in map(chr,[66,53,0,94]):
li.append(x)
print (li)
>>>['B', '5', '\x00', '^']
Wir können durch ein anderes Beispiel verallgemeinern, in dem ich getroffen wurde. Operationen auf der Karte können auch auf ähnliche Weise gehandhabt werden wie in regex
-Problem. Wir können eine Funktion schreiben, um list
von Elementen zu erhalten, die zugeordnet werden sollen, und gleichzeitig das Ergebnis zu erhalten. Ex.
b = 'Strings: 1,072, Another String: 474 '
li = []
for x in map(int,map(int, re.findall('\d+', b))):
li.append(x)
print (li)
>>>[1, 72, 474]