Question

Je suis en train de tracer une liste dans six pans, puis utilisez la liste ailleurs. En Python 2.6, c'était facile:

A: Python 2.6:

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

Cependant, en Python 3.1, le retourne au-dessus d'un objet de la carte.

B: Python 3.1:

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

Comment puis-je récupérer la liste cartographié (comme dans ci-dessus) sur Python 3.x?

Sinon, est-il une meilleure façon de le faire? Mon premier objet de la liste a environ 45 articles et id aiment les convertir en hexadécimal.

Était-ce utile?

La solution

Pour ce faire:

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

En Python 3+, de nombreux processus qui itérer sur iterables retour itérateurs eux-mêmes. Dans la plupart des cas, cela finit par la mémoire d'économie, et devrait rendre les choses aller plus vite.

Si tout ce que vous allez faire itérer sur cette liste par la suite, il n'y a pas besoin de convertir même à une liste, parce que vous pouvez toujours itérer sur l'objet map comme ceci:

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

Autres conseils

Pourquoi ne faites-vous ceci:

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

Il appelle une compréhension de la liste. Vous pouvez trouver beaucoup d'informations sur Google, mais voici le lien vers le Python (2.6) documentation sur la liste compréhensions. Vous pourriez être plus intéressé par Documenation Python 3, cependant.

Nouveau et soigné en Python 3.5:

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

Merci supplémentaires Déballer Généralisations

UPDATE

Toujours à la recherche de moyens plus courtes, je découvre celui-ci fonctionne aussi:

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

Déballer fonctionne tuples aussi. Notez la virgule à la fin. Cela en fait un tuple de 1 élément. Autrement dit, il est équivalent à (*map(chr, [66, 53, 0, 94]),)

Il est plus court par un seul omble chevalier de la version avec la liste de supports, mais, à mon avis, il vaut mieux écrire, parce que vous commencez juste avant avec l'astérisque - la syntaxe d'expansion, donc je pense qu'il est plus doux sur l'esprit. :)

Fonction carte Liste-retour a l'avantage de sauver la dactylographie, en particulier lors de sessions interactives. Vous pouvez définir la fonction lmap (par analogie avec la imap de python2) qui retourne la liste:

lmap = lambda func, *iterable: list(map(func, *iterable))

Alors appelant lmap au lieu de map fera le travail: lmap(str, x) est plus courte de 5 caractères (30% dans ce cas) et que list(map(str, x)) est certainement plus court que [str(v) for v in x]. Vous pouvez créer des fonctions similaires pour filter aussi.

Il y avait un commentaire à la question initiale:

  

Je suggère un changement de nom à la carte () Apprendre à retourner une liste en Python 3. * car il applique à toutes les versions python3. Y a-t-il un moyen de faire cela? - meawoppl 24 janvier à 17h58

est possible de le faire, mais il est une très mauvaise idée. Juste pour le plaisir, voici comment vous pouvez ( mais ne devrait pas ) faire:

__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

Je ne suis pas familier avec Python 3.1, mais ce travail?

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

mon vieux commentaire pour une meilleure visibilité: pour une « meilleure façon de le faire » sans map entièrement, si vos entrées sont connus pour être ordinaux ASCII, il est généralement beaucoup plus rapide de se convertir à bytes et décoder, à la bytes(list_of_ordinals).decode('ascii'). Cela vous obtient un str des valeurs, mais si vous avez besoin d'un list pour mutabilité ou similaire, vous pouvez simplement le convertir (et il est encore plus rapide). Par exemple, dans microbenchmarks de ipython convertir 45 entrées:

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

Si vous le laissez comme str, il faut environ 20% du temps des plus rapides des solutions map; même la conversion de retour à la liste, il est encore moins de 40% de la solution la plus rapide map. converti en vrac via bytes et bytes.decode ensuite en vrac retransférer list permet d'économiser beaucoup de travail, mais comme indiqué, ne fonctionne que si toutes vos entrées sont ordinaux ASCII (ou ordinaux dans certains un octet par lieu de codage de caractères spécifique , par exemple latin-1).

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

carte (Func, * iterables) -> objet carte      Faire un itérateur qui calcule la fonction en utilisant des arguments de      chacun des iterables. Arrête quand le plus court itérables est épuisé.

     

"Faire un itérateur"

signifie qu'il retourne un itérateur.

  

« qui calcule la fonction en utilisant les arguments de chacun des iterables »

signifie que la fonction suivante () de l'itérateur prendra une valeur de chaque iterables et passer chacun d'eux à un paramètre de positionnement de la fonction.

Vous obtenez un itérateur de la carte () funtion et jsut passer à la liste () fonction intégrée ou liste d'utilisation compréhensions.

En plus de réponses ci-dessus dans Python 3, nous pouvons simplement créer une list des valeurs de résultat d'un map comme

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

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

On peut généraliser par un autre exemple où j'ai été frappé, les opérations sur la carte peuvent également être traitées de la même façon que dans le problème de regex, nous pouvons fonction écrire pour obtenir list des articles à la carte et obtenir le jeu de résultats en même temps. 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]

Utilisation de la compréhension de la liste en python et l'utilité de la fonction de carte de base, on peut le faire aussi:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top