J'essaie de mapper une liste en hexadécimal, puis j'utilise 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, ce qui précède renvoie un objet de carte.
B: Python 3.1:
>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>
Comment récupérer la liste mappée (comme dans A ci-dessus) sur Python 3.x?
Sinon, existe-t-il une meilleure façon de procéder? Mon objet de liste initial contient environ 45 éléments et je souhaite les convertir en hexadécimal.
python
list
python-3.x
map-function
mozami
la source
la source
map()
a été presque supprimé de la langue car il n'y a aucune raison de l'utiliser sur une compréhension de liste ou unefor
boucle.Réponses:
Faites ceci:
Dans Python 3+, de nombreux processus qui itèrent sur les itérables renvoient eux-mêmes les itérateurs. Dans la plupart des cas, cela finit par économiser de la mémoire et devrait accélérer les choses.
Si tout ce que vous allez faire est de parcourir cette liste, il n'est même pas nécessaire de la convertir en liste, car vous pouvez toujours itérer sur l'
map
objet comme ceci:la source
map
serait une évaluation paresseuse lors de l'itération d'une fonction complexe, de grands ensembles de données ou de flux.bytes(sequence_of_ints_in_range_0_to_256).decode('latin-1')
ce quistr
accélère en évitant les appels de fonction Python pour chaque élément en faveur d'une conversion en masse de tous les éléments utilisant uniquement des appels de fonction de niveau C. Vous pouvez envelopper ce qui précèdelist
si vous avez vraiment besoin d'unlist
des caractères individuels, mais comme ilstr
est déjà un itérable de ses propres caractères, la seule raison pour laquelle vous le feriez est si vous avez besoin d'une mutabilité.Nouveau et soigné dans Python 3.5:
Grâce aux généralisations de déballage supplémentaires
MISE À JOUR
Toujours à la recherche de voies plus courtes, j'ai découvert que celle-ci fonctionne également:
Le déballage fonctionne également en tuples. Notez la virgule à la fin. Cela en fait un tuple de 1 élément. Autrement dit, c'est équivalent à
(*map(chr, [66, 53, 0, 94]),)
Il est plus court d'un seul caractère de la version avec les crochets de liste, mais, à mon avis, mieux vaut écrire, car vous commencez tout de suite avec l'astérisque - la syntaxe d'extension, donc je pense que c'est plus doux pour l'esprit. :)
la source
list()
n'a pas l'air aussi soignélist
constructeur et d'appeler la machinerie générale d'appel des fonctions. Pour une longue entrée, cela n'aura pas d'importance; pour un court, cela peut faire une grande différence. En utilisant le code ci-dessus avec l'entrée comme untuple
afin qu'il ne soit pas reconstruit à plusieurs reprises, lesipython
repères microbiens montrent que l'list()
approche d'emballage prend environ 20% de plus que le déballage. Attention, en termes absolus, nous parlons de 150 ns, ce qui est trivial, mais vous avez l'idée.map
? Peut-être avec un nouveau nom (lmap
?) Si la nouvelle valeur par défaut est de retourner un itérateur?*map()
donne erreur de syntaxe surPython 3.6
:can't use starred expression here
. Vous devez le mettre dans unlist
:[ *map() ]
Pourquoi tu ne fais pas ça:
Cela s'appelle une compréhension de liste. Vous pouvez trouver de nombreuses informations sur Google, mais voici le lien vers la documentation Python (2.6) sur les compréhensions de liste . Cependant , vous pourriez être plus intéressé par la documentation de Python 3 .
la source
map(chr, [66,53,0,94])
est définitivement plus concis que[chr(x) for x in [66,53,0,94]]
.La fonction de carte de retour de liste a l'avantage d'économiser la saisie, en particulier pendant les sessions interactives. Vous pouvez définir une
lmap
fonction (sur l'analogie de python2imap
) qui retourne la liste:Ensuite, appeler à la
lmap
place demap
fera l'affaire:lmap(str, x)
est plus court de 5 caractères (30% dans ce cas) quelist(map(str, x))
et est certainement plus court que[str(v) for v in x]
. Vous pouvez également créer des fonctions similairesfilter
.Il y avait un commentaire à la question initiale:
Il est possible de le faire, mais il est une très mauvaise idée. Juste pour le plaisir, voici comment vous pouvez ( mais ne devriez pas ) le faire:
la source
Conversion de mon ancien commentaire pour une meilleure visibilité: Pour une "meilleure façon de faire" sans
map
entièrement, si vos entrées sont connues pour être des ordinaux ASCII, il est généralement beaucoup plus rapide de convertirbytes
et de décoder, a labytes(list_of_ordinals).decode('ascii')
. Cela vous donne unestr
des valeurs, mais si vous avez besoin d'unelist
mutabilité ou similaire, vous pouvez simplement la convertir (et c'est encore plus rapide). Par exemple, dans lesipython
microbenchmarks convertissant 45 entrées:Si vous le laissez comme un
str
, cela prend environ 20% du temps desmap
solutions les plus rapides ; même en revenant à la liste, c'est toujours moins de 40% de lamap
solution la plus rapide . Converti en vrac par l' intermédiairebytes
etbytes.decode
puis bulk retransférerlist
permet d' économiser beaucoup de travail, mais comme il est indiqué, ne fonctionne que si toutes vos entrées sont ordinaux ASCII (ou ordinaux dans certains un octet par paramètres régionaux de codage des caractères spécifique, par exemplelatin-1
).la source
signifie qu'il renverra un itérateur.
signifie que la fonction next () de l'itérateur prendra une valeur de chaque itérable et passera chacun d'eux à un paramètre positionnel de la fonction.
Vous obtenez donc un itérateur de la fonction map () et le transmettez à la fonction intégrée list () ou utilisez des compréhensions de liste.
la source
En plus des réponses ci-dessus
Python 3
, nous pouvons simplement créer une valeurlist
de résultat à partir d'unmap
asNous pouvons 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 manière que dans le
regex
problème, nous pouvons écrire une fonction pour obtenirlist
des éléments à mapper et obtenir un jeu de résultats en même temps. Ex.la source
Vous pouvez essayer d'obtenir une liste à partir de l'objet de carte en itérant simplement chaque élément de l'objet et en le stockant dans une variable différente.
la source
En utilisant la compréhension de liste en python et l'utilitaire de fonction de carte de base, on peut aussi le faire:
chi = [x for x in map(chr,[66,53,0,94])]
la source