¿Cómo imprimir “correctamente” una lista?

95

Entonces tengo una lista:

['x', 3, 'b']

Y quiero que la salida sea:

[x, 3, b]

¿Cómo puedo hacer esto en Python?

Si lo hago str(['x', 3, 'b']), obtengo uno con comillas, pero no quiero comillas.

Obaid
fuente
Para explicar por qué la lista no se imprime "correctamente", print(["Sam"])llama repr("Sam"), que devuelve 'Sam'(con las comillas), a diferencia de cuando llamas print("Sam")y Python llama str("Sam")que devuelve Sam(sin las comillas). Ver diferencia entre stryrepr o Python stry lists para obtener más información.
Anónimo

Respuestas:

188

En Python 2:

mylist = ['x', 3, 'b']
print '[%s]' % ', '.join(map(str, mylist))

En Python 3 (donde printes una función incorporada y ya no una característica de sintaxis):

mylist = ['x', 3, 'b']
print('[%s]' % ', '.join(map(str, mylist)))

Ambos regresan:

[x, 3, b]

Esto está usando la map()función para llamar a str para cada elemento de mylist , creando una nueva lista de cadenas que luego se une en una cadena con str.join(). Luego, el %operador de formato de cadena sustituye la cadena en en lugar de %sen "[%s]".

SingleNegationElimination
fuente
4
Gracias, eso funciona muy bien. ¿Puede explicar un poco en detalle qué está haciendo en la segunda línea? Soy nuevo en Python.
Obaid
19
Está usando la mapfunción para llamar stra cada elemento de mylist, creando una nueva lista de cadenas que luego une en una cadena str.join. Luego, usa el %operador de formato de cadena para sustituir la cadena en en lugar de %sen "[%s]".
li.davidm
6
Otra forma de hacerlo que es quizás un poco más moderna: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor
2
tiendo a preferir map(f, xs)(o imapen python2.x) sobre (f(x) for x in xs), cuando fes un invocable predefinido; que tiende a ejecutar menos códigos de bytes y suele ser más compacto. Ciertamente, eso no map(lambda x:..., xs) es mucho peor que(... for x in xs)
SingleNegationElimination
1
@ user1767754: ¿en serio? ¿Enlace?
SingleNegationElimination
18

Este es un código simple, por lo que si es nuevo, debe comprenderlo con bastante facilidad.

    mylist = ["x", 3, "b"]
    for items in mylist:
        print(items)

Los imprime todos sin comillas, como quisiera.

reemer9997
fuente
15

Usando solo impresión:

>>> l = ['x', 3, 'b']
>>> print(*l, sep='\n')
x
3
b
>>> print(*l, sep=', ')
x, 3, b
finlandés
fuente
14

Si está utilizando Python3:

print('[',end='');print(*L, sep=', ', end='');print(']')
Kabie
fuente
1
¿Qué hace print (* L) aquí?
sandeeps
1
Estoy confundido por esto. ¿El tipo de datos largo está filtrando la lista de alguna manera?
Dval
Una versión más concisa seríaprint(end='['); print(*l, sep=', ', end=']\n')
Anónimo
9

En lugar de usar map, recomendaría usar una expresión generadora con la capacidad de joinaceptar un iterador:

def get_nice_string(list_or_iterator):
    return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

Aquí, joines una función miembro de la clase de cadena str. Toma un argumento: una lista (o iterador) de cadenas, luego devuelve una nueva cadena con todos los elementos concatenados por, en este caso ,,.

Seth Johnson
fuente
2
Una buena optimización para Python 2, ya que map devuelve una lista en 2.x. Devuelve un generador en 3.x, por lo que no ayuda tanto allí.
Tom Zych
7
Volvería", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem
@eyquem: Inteligente, no había visto unirse de esa manera antes. Aún así, eso es un poco más opaco para un principiante (ya que está usando la propiedad de que una cadena es un contenedor iterable de cadenas de un carácter).
Seth Johnson
6

Puede eliminar todos los caracteres no deseados de una cadena utilizando su translate()método con Nonepara el tableargumento seguido de una cadena que contiene los caracteres que desea eliminar para su deletecharsargumento.

lst = ['x', 3, 'b']

print str(lst).translate(None, "'")

# [x, 3, b]

Si está utilizando una versión de Python anterior a la 2.6, deberá usar la función stringdel módulo en su translate()lugar porque la capacidad de pasar Nonecomo tableargumento no se agregó hasta Python 2.6. Usarlo se ve así:

import string

print string.translate(str(lst), None, "'")

El uso de la string.translate()función también funcionará en 2.6+, por lo que podría ser preferible usarla.

martineau
fuente
2
Por desgracia: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]y también conlst = ['it isn\'t', 3, 'b']
eyquem
1
@eyquem: Sí, evitar la eliminación de caracteres que en realidad son parte de sus datos (en lugar de usarse estrictamente para delimitarlos) naturalmente requeriría una lógica un poco más elaborada / diferente si es una posibilidad.
martineau
3

Aquí hay una sesión interactiva que muestra algunos de los pasos en una sola línea de @ TokenMacGuy. Primero, usa la mapfunción para convertir cada elemento de la lista en una cadena (en realidad, está creando una nueva lista, no convirtiendo los elementos de la lista anterior). Luego está usando el método de cadena joinpara combinar esas cadenas ', 'entre ellas. El resto es solo formato de cadena, que es bastante sencillo. (Editar: esta instancia es sencilla; el formato de cadena en general puede ser algo complejo).

Tenga en cuenta que usar joines una forma simple y eficiente de construir una cadena a partir de varias subcadenas, mucho más eficiente que hacerlo agregando cadenas sucesivamente a las cadenas, lo que implica una gran cantidad de copias detrás de escena.

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'
Tom Zych
fuente
2

Utilizando .formatpara formatear cadenas,

mylist = ['x', 3, 'b']
print("[{0}]".format(', '.join(map(str, mylist))))

Salida:

[x, 3, b]

Explicación:

  1. mapse utiliza para mapear cada elemento de la lista a stringescribir.
  2. Los elementos se unen en una cadena con un ,separador.
  3. Usamos [y ]en la declaración de impresión para mostrar las llaves de la lista.

Referencia: .formatpara formato de cadena PEP-3101

Ani Menon
fuente
¡Excelente! Encuentro usando .formatla forma más pitónica. Pero, por supuesto, acepto los desacuerdos. ;)
amado.por.Jesus
0

Me inspiré en @AniMenon para escribir una solución pitónica más general.

mylist = ['x', 3, 'b']
print('[{}]'.format(', '.join(map('{}'.format, mylist))))

Solo usa el formatmétodo. Sin rastro de str, y permite el ajuste fino del formato de los elementos. Por ejemplo, si tiene números flotantes como elementos de la lista, puede ajustar su formato agregando un especificador de conversión, en este caso:.2f

mylist = [1.8493849, -6.329323, 4000.21222111]
print("[{}]".format(', '.join(map('{:.2f}'.format, mylist))))

La salida es bastante decente:

[1.85, -6.33, 4000.21]
amado.por.Jesús
fuente