Frage

Ich versuche, eine Liste in hex abzubilden, und dann die Liste an anderer Stelle verwenden. In Python 2.6 war dies einfach:

A: Python 2.6:

>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']

Doch in Python 3.1, gibt die oben ein Kartenobjekt.

B: Python 3.1:

>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>

Wie rufe ich die abgebildete Liste (wie in A oben) auf Python 3.x?

Alternativ gibt es einen besseren Weg, dies zu tun? Meine erste Liste Objekt verfügt über rund 45 Objekte und id wie sie hex zu konvertieren.

War es hilfreich?

Lösung

Tun Sie dies:

list(map(chr,[66,53,0,94]))

In Python 3+, viele Prozesse, die über Iterables iterieren zurückkehren Iteratoren sich. In den meisten Fällen endet dieser Speicher sparend auf und sollte die Dinge schneller gehen.

Wenn alles, was Sie tun werden, um schließlich über diese Liste durchlaufen wird, gibt es keine Notwendigkeit, auch sie in eine Liste zu konvertieren, weil Sie immer noch das map Objekt iterieren können etwa so:

# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
    print(ch)

Andere Tipps

Warum sind Sie nicht dies zu tun:

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

Es ist eine Liste Verständnis genannt. Sie können viele Informationen über Google finden, aber hier ist der Link zu den Python (2.6) Dokumentation auf Listenkomprehensionen . Vielleicht haben Sie mehr Interesse an der Python 3 documenation , obwohl sein.

Neue und ordentlich in Python 3.5:

[*map(chr, [66, 53, 0, 94])]

Dank Zusätzliche Auspacken Verallgemeinerungen

UPDATE

Immer für kürzere Wege zu suchen, entdeckte ich dieses auch funktioniert:

*map(chr, [66, 53, 0, 94]),

Auspacken funktioniert auch in Tupeln. Beachten Sie das Komma am Ende. Dies macht es zu einem Tupel von 1 Elemente. Das heißt, es ist äquivalent zu (*map(chr, [66, 53, 0, 94]),)

Es ist kürzer, indem nur ein Zeichen von der Version mit den list-Klammern, aber meiner Meinung nach, besser zu schreiben, weil Sie nach rechts weiter mit dem Sternchen beginnen - der Erweiterung Syntax, so dass ich glaube, es ist weicher auf dem Geist. :)

List-Rückkehr Kartenfunktion hat den Vorteil, typing zu sparen, vor allem während der interaktiven Sitzungen.

: Sie können lmap Funktion (in Analogie zu python2 der imap), die zurückgibt Liste definieren
lmap = lambda func, *iterable: list(map(func, *iterable))

Dann ruft lmap statt map wird die Arbeit tun: lmap(str, x) kürzer von 5 Zeichen (30% in diesem Fall) als list(map(str, x)) und ist sicherlich kürzer als [str(v) for v in x]. Sie können für filter auch ähnliche Funktionen erstellen.

Es gab einen Kommentar auf die ursprüngliche Frage:

  

würde ich ein umbenanntes Erste Karte () legen nahe, eine Liste in Python 3. zurückzukehren *, wie es für alle Python3 Versionen gilt. Gibt es eine Möglichkeit, dies zu tun? - meawoppl 24. Januar um 17:58 Uhr

Es ist möglich zu tun, aber es ist eine sehr schlechte Idee. Just for fun, hier, wie Sie können ( sollte aber nicht ) es tun:

__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 vertraut mit Python 3.1, aber wird diese Arbeit?

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

Konvertieren von Kommentar für eine bessere Sichtbarkeit: für einen ohne map völlig „besserer Weg, dies zu tun“, wenn sie Ihre Eingaben ASCII Ordinalzahlen bekannt sind, es in der Regel sehr viel schneller zu konvertieren bytes und dekodieren, a la bytes(list_of_ordinals).decode('ascii'). Das bekommt man eine str der Werte, aber wenn Sie eine list für Veränderlichkeit oder dergleichen benötigen, können Sie einfach konvertieren es (und es ist immer noch schneller). Zum Beispiel in ipython Microbenchmarks Umwandlung 45 Eingänge:

>>> %%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 verlassen, dauert es ca. 20% der Zeit der schnellsten map Lösungen; Umwandlung sogar noch weniger als 40% der schnellsten map Lösung ist es zurück zur Liste. Bulk convert über bytes und bytes.decode dann Bulk-zurück zu list Umwandlung spart eine Menge Arbeit, und wie bereits erwähnt, funktioniert nur, wenn alle Eingänge ASCII ordinals (oder ordinals in einigen ein Byte pro Zeichen lokalspezifische Kodierung sind zB latin-1).

list(map(chr, [66, 53, 0, 94]))
  

Karte (func, * Iterables) -> Kartenobjekt      Machen Sie einen Iterator, der die Funktion berechnet unter Verwendung von Argumenten aus      jede der Iterables. Stoppt, wenn die kürzeste iterable erschöpft ist.

     

"Machen Sie einen Iterator"

bedeutet, dass es einen Iterator zurück.

  

„Das berechnet die Funktionsargumente von jedem des Iterables mit“

bedeutet, dass die nächste () Funktion des Iterators einen Wert von jeweils Iterables nehmen und jede von ihnen an einen Positionsparameter der Funktion übergeben.

So können Sie einen Iterator aus der Karte () funtion bekommen und es jsut passieren in die Liste () eingebaute Funktion oder Verwendung Listenkomprehensionen.

Zusätzlich zu dem oben Antworten in Python 3, können wir einfach ein list von Ergebniswerten aus einer map als

erstellen
li = []
for x in map(chr,[66,53,0,94]):
    li.append(x)

print (li)
>>>['B', '5', '\x00', '^']

Wir sind von einem anderen Beispiel verallgemeinern kann, wo ich Operationen auf der Karte geschlagen, kann auch in ähnlicher Weise wie Problem in regex behandelt werden, können wir die Funktion schreiben list von Elementen zu erhalten abzubilden und gleichzeitig die Ergebnismenge 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]

Mit Liste Verständnis in Python und grundlegende Kartenfunktion Dienstprogramm, kann man dies auch tun:

chi = [x for x in map(chr,[66,53,0,94])]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top