Estoy tratando de mapear una lista en hexadecimal, y luego usar la lista en otro lugar. En python 2.6, esto fue fácil:
A: Python 2.6:
>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']
Sin embargo, en Python 3.1, lo anterior devuelve un objeto de mapa.
B: Python 3.1:
>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>
¿Cómo recupero la lista asignada (como en A arriba) en Python 3.x?
Alternativamente, ¿hay una mejor manera de hacer esto? Mi objeto de lista inicial tiene alrededor de 45 elementos y me gustaría convertirlos en hexadecimal.
python
list
python-3.x
map-function
mozami
fuente
fuente
map()
fue casi eliminado del lenguaje porque no hay razón para usarlo en una lista de comprensión o unfor
bucle.Respuestas:
Hacer esto:
En Python 3+, muchos procesos que iteran sobre iterables devuelven iteradores ellos mismos. En la mayoría de los casos, esto termina ahorrando memoria y debería hacer que las cosas vayan más rápido.
Si todo lo que vas a hacer es iterar sobre esta lista eventualmente, no hay necesidad de convertirla en una lista, porque aún puedes iterar sobre el
map
objeto de esta manera:fuente
map
sería una evaluación perezosa cuando se itera en una función compleja, grandes conjuntos de datos o secuencias.bytes(sequence_of_ints_in_range_0_to_256).decode('latin-1')
que hacestr
más rápido al evitar llamadas a la función Python para cada elemento a favor de una conversión masiva de todos los elementos que usan solo llamadas de función de nivel C. Puede incluir lo anteriorlist
si realmente necesita unolist
de los caracteres individuales, pero dadostr
que ya es un iterable de sus propios caracteres, la única razón por la que lo haría es si necesita mutabilidad.Nuevo y ordenado en Python 3.5:
Gracias a las generalizaciones de desempaquetado adicionales
ACTUALIZAR
Siempre buscando formas más cortas, descubrí que esta también funciona:
Desempacar también funciona en tuplas. Tenga en cuenta la coma al final. Esto lo convierte en una tupla de 1 elemento. Es decir, es equivalente a
(*map(chr, [66, 53, 0, 94]),)
Es más corto en solo un carácter de la versión con los corchetes de lista, pero, en mi opinión, es mejor escribir, porque comienzas con el asterisco, la sintaxis de expansión, así que siento que es más suave en la mente. :)
fuente
list()
no se ve tan ordenadolist
constructor e invocar la maquinaria de llamada de función general. Para una entrada larga, no importará; para uno corto, puede hacer una gran diferencia. Usando el código anterior con la entrada como un elementotuple
para que no se reconstruya repetidamente, losipython
microbenchmarks muestran que ellist()
enfoque de envoltura tarda aproximadamente un 20% más que desempaquetar. Eso sí, en términos absolutos, estamos hablando de 150 ns, lo cual es trivial, pero entiendes la idea.map
? ¿Quizás con un nuevo nombre (lmap
?) Si el nuevo valor predeterminado es devolver un iterador?*map()
da error de sintaxis enPython 3.6
:can't use starred expression here
. Debe ponerlo en unlist
:[ *map() ]
¿Por qué no haces esto?
Se llama una lista de comprensión. Puede encontrar mucha información en Google, pero aquí está el enlace a la documentación de Python (2.6) sobre comprensiones de listas . Sin embargo, es posible que esté más interesado en la documentación de Python 3 .
fuente
map(chr, [66,53,0,94])
es definitivamente más concisa que[chr(x) for x in [66,53,0,94]]
.La función de mapa de retorno de lista tiene la ventaja de guardar la escritura, especialmente durante las sesiones interactivas. Puede definir la
lmap
función (en la analogía de python2imap
) que devuelve la lista:Entonces llamar en
lmap
lugar demap
hará el trabajo:lmap(str, x)
es más corto en 5 caracteres (30% en este caso) quelist(map(str, x))
y ciertamente es más corto que[str(v) for v in x]
. También puede crear funciones similares parafilter
.Hubo un comentario a la pregunta original:
Que es posible hacer eso, pero es una idea muy mala. Solo por diversión, así es como puede ( pero no debe ) hacerlo:
fuente
Convertir mi comentario anterior para una mejor visibilidad: para una "mejor manera de hacer esto" sin necesidad de nada
map
, si se sabe que sus entradas son ordinales ASCII, generalmente es mucho más rápido convertirbytes
y decodificar, a labytes(list_of_ordinals).decode('ascii')
. Eso le proporciona unostr
de los valores, pero si necesita un valorlist
de mutabilidad o similar, simplemente puede convertirlo (y aún es más rápido). Por ejemplo, enipython
microbenchmarks que convierten 45 entradas:Si lo deja como a
str
, lleva ~ 20% del tiempo de lasmap
soluciones más rápidas ; incluso volver a convertir a la lista sigue siendo menos del 40% de lamap
solución más rápida . La conversión masiva a través debytes
ybytes.decode
luego la conversión masiva de nuevo alist
ahorra mucho trabajo, pero como se señaló, solo funciona si todas sus entradas son ordinales ASCII (u ordinales en algún byte por codificación específica de localización de caracteres, por ejemplolatin-1
).fuente
significa que devolverá un iterador.
significa que la función next () del iterador tomará un valor de cada iterable y pasará cada uno de ellos a un parámetro posicional de la función.
Entonces obtienes un iterador de la función map () y lo pasas a la función incorporada list () o usas comprensiones de listas.
fuente
Además de las respuestas anteriores en
Python 3
, simplemente podemos crear unlist
de valores de los resultados de unamap
comoPodemos generalizar con otro ejemplo en el que me llamó la atención, las operaciones en el mapa también se pueden manejar de manera similar, como en el
regex
problema, podemos escribir la función para obtenerlist
elementos para asignar y obtener el conjunto de resultados al mismo tiempo. Ex.fuente
Puede intentar obtener una lista del objeto de mapa simplemente iterando cada elemento en el objeto y almacénelo en una variable diferente.
fuente
Usando la comprensión de la lista en Python y la utilidad básica de la función de mapa, también se puede hacer esto:
chi = [x for x in map(chr,[66,53,0,94])]
fuente