Forma pitónica de imprimir elementos de lista

114

Me gustaría saber si hay una mejor manera de imprimir todos los objetos en una lista de Python que esta:

myList = [Person("Foo"), Person("Bar")]
print("\n".join(map(str, myList)))
Foo
Bar

Leo de esta manera no es muy bueno:

myList = [Person("Foo"), Person("Bar")]
for p in myList:
    print(p)

¿No hay algo como:

print(p) for p in myList

Si no es así, mi pregunta es ... ¿por qué? Si podemos hacer este tipo de cosas con listas completas, ¿por qué no como una simple declaración fuera de una lista?

Guillaume Voiron
fuente
3
¿De dónde tuvo la impresión de que usar for p in myList"no era realmente bueno"?
Jon Clements
@JonClements: chrisarndt.de/talks/rupy/2008/output/slides.html
Guillaume Voiron
@pelotasplus: para nada :) Y, por cierto, no me gusta mi primera versión que no es "legible"
Guillaume Voiron

Respuestas:

220

Suponiendo que está utilizando Python 3.x:

print(*myList, sep='\n')

Puede obtener el mismo comportamiento en Python 2.x usando from __future__ import print_function, como lo señaló mgilson en los comentarios.

Con la declaración de impresión en Python 2.x, necesitará una iteración de algún tipo, con respecto a su pregunta sobre print(p) for p in myListno funcionar, puede usar lo siguiente que hace lo mismo y sigue siendo una línea:

for p in myList: print p

Para una solución que usa '\n'.join(), prefiero listas por comprensión y generadores, por map()lo que probablemente usaría lo siguiente:

print '\n'.join(str(p) for p in myList) 
Andrew Clark
fuente
3
Y si no, puede from __future__ import print_functionhacerlo en python2.6 y versiones posteriores.
mgilson
en python 2x usar map es un poco más rápido que usar join en una lista de comprensión.
Juan Carlos Moreno
1
¿Por qué el voto negativo, realmente se debe a la diferencia de velocidad entre map()y un generador? El creador de Python también prefiere las comprensiones y los generadoresmap() .
Andrew Clark
No te voté en contra. Estoy familiarizado con esa publicación de GVR, que era su forma de decir, en ese entonces, cómo las futuras versiones de python no lo iban a incluir, pero terminaron quedándose.
Juan Carlos Moreno
1
Se quedaron en Python 3.x, pero su punto en ese artículo es que [F(x) for x in S]es más claro que map(F, S). El rendimiento no se aborda allí, pero esperaría que la diferencia de velocidad sea insignificante. De todos modos, estaba confundido por el voto negativo, ¡lo siento, asumí que eras tú!
Andrew Clark
28

Uso esto todo el tiempo :

#!/usr/bin/python

l = [1,2,3,7] 
print "".join([str(x) for x in l])
lucasg
fuente
1
Para agregar format(), reemplace str(x)con una cadena de formato:print " ".join(["{:02d}".format(x) for x in l])
ChrisFreeman
8

[print(a) for a in list] dará un montón de tipos Ninguno al final, aunque imprime todos los elementos

ytpillai
fuente
esto es lo que he estado usando hasta ahora. Es una línea, muy clara y expresiva, pero linter quejas "La expresión no se asigna a nada"
alete
1
Si desea trollear el linter, puede crear una función separada que lo imprima y devuelva un valor estúpido y llame a esa función en la lista de comprensión
ytpillai
3

Para Python 2. *:

Si sobrecarga la función __str __ () para su clase Person, puede omitir la parte con map (str, ...). Otra forma de hacer esto es crear una función, como escribiste:

def write_list(lst):
    for item in lst:
        print str(item) 

...

write_list(MyList)

Hay en Python 3. * el argumento sep para la función print (). Eche un vistazo a la documentación.

gukoff
fuente
3

Ampliando la respuesta de @ lucasg (inspirada en el comentario que recibió):

Para obtener una salida de lista formateada , puede hacer algo en este sentido:

l = [1,2,5]
print ", ".join('%02d'%x for x in l)

01, 02, 05

Ahora ", "proporciona el separador (solo entre elementos, no al final) y la cadena de formato '02d'combinada con %xda una cadena formateada para cada elemento x; en este caso, formateado como un número entero con dos dígitos, llenado a la izquierda con ceros.

Floris
fuente
2

Para mostrar cada contenido, uso:

mylist = ['foo', 'bar']
indexval = 0
for i in range(len(mylist)):     
    print(mylist[indexval])
    indexval += 1

Ejemplo de uso en una función:

def showAll(listname, startat):
   indexval = startat
   try:
      for i in range(len(mylist)):
         print(mylist[indexval])
         indexval = indexval + 1
   except IndexError:
      print('That index value you gave is out of range.')

Espero haber ayudado.

Memes Divertidos
fuente
1
Solo como nota, marque la respuesta que se encuentra arriba. ¿Utiliza un rango, que proporciona un valor de índice, i, pero utiliza otra variable, indexval, como índice? Estás luchando contra la simplicidad de Python. para val en my_list: print val hace lo mismo que lo que tienes
BretD
1

Creo que esto es lo más conveniente si solo desea ver el contenido de la lista:

myList = ['foo', 'bar']
print('myList is %s' % str(myList))

Simple, fácil de leer y se puede utilizar junto con la cadena de formato.

Rongzhao Zhang
fuente
1

La pregunta de OP es: ¿existe algo como seguir? Si no, ¿por qué?

print(p) for p in myList # doesn't work, OP's intuition

la respuesta es, existe, que es:

[p for p in myList] #works perfectly

Básicamente, utilícelo []para la comprensión de listas y elimínelo printpara evitar la impresión None. Para ver por qué las printimpresiones Noneven esto

Gaurav Singhal
fuente
1

Recientemente hice un generador de contraseñas y, aunque soy MUY NUEVO en Python, lo preparé como una forma de mostrar todos los elementos en una lista (con pequeñas ediciones para satisfacer sus necesidades ...

    x = 0
    up = 0
    passwordText = ""
    password = []
    userInput = int(input("Enter how many characters you want your password to be: "))
    print("\n\n\n") # spacing

    while x <= (userInput - 1): #loops as many times as the user inputs above
            password.extend([choice(groups.characters)]) #adds random character from groups file that has all lower/uppercase letters and all numbers
            x = x+1 #adds 1 to x w/o using x ++1 as I get many errors w/ that
            passwordText = passwordText + password[up]
            up = up+1 # same as x increase


    print(passwordText)

Como dije, SOY MUY NUEVO en Python y estoy seguro de que esto es demasiado complicado para un experto, pero solo estoy aquí para otro ejemplo.

Nate Baker
fuente
0

Suponiendo que está bien con la impresión de su lista [1,2,3], entonces una forma fácil en Python3 es:

mylist=[1,2,3,'lorem','ipsum','dolor','sit','amet']

print(f"There are {len(mylist):d} items in this lorem list: {str(mylist):s}")

Ejecutar esto produce el siguiente resultado:

Hay 8 elementos en esta lista de lorem: [1, 2, 3, 'lorem', 'ipsum', 'dolor', 'sit', 'amet']

Etalidas
fuente