it-swarm.com.de

Eine Map () abrufen, um eine Liste in Python 3.x zurückzugeben

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.

409
mozami

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)
621
Triptych

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 .

86
Mark Rushakoff

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. :)

71
Israel Unterman

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
22
Boris Gorelik

Ich bin nicht mit Python 3.1 vertraut, aber wird dies funktionieren?

[chr(x) for x in [66, 53, 0, 94]]
11
Andrew Keeton

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).

3
ShadowRanger

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])]

1
darshan k s
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.

0
Ini

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]
0
Harry_pb