Modo pitonico per stampare gli elementi dell'elenco


114

Vorrei sapere se esiste un modo migliore per stampare tutti gli oggetti in un elenco Python di questo:

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

Ho letto in questo modo non è proprio buono:

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

Non c'è qualcosa come:

print(p) for p in myList

In caso contrario, la mia domanda è ... perché? Se possiamo fare questo genere di cose con elenchi completi, perché non come una semplice dichiarazione al di fuori di un elenco?


3
Dove hai avuto l'impressione che l'utilizzo for p in myList"non fosse proprio buono"?
Jon Clements


@pelotasplus: per niente :) E comunque non mi piace molto la mia prima versione che non è "leggibile"
Guillaume Voiron

Risposte:


220

Supponendo che tu stia usando Python 3.x:

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

Puoi ottenere lo stesso comportamento su Python 2.x usando from __future__ import print_function, come notato da mgilson nei commenti.

Con l'istruzione print su Python 2.x avrai bisogno di un'iterazione di qualche tipo, per quanto riguarda la tua domanda sul print(p) for p in myListnon funzionare, puoi semplicemente usare quanto segue che fa la stessa cosa ed è ancora una riga:

for p in myList: print p

Per una soluzione che utilizza '\n'.join(), preferisco le comprensioni di elenchi e i generatori, map()quindi probabilmente userei quanto segue:

print '\n'.join(str(p) for p in myList) 

3
In caso contrario, puoi farlo from __future__ import print_functionsu python2.6 e versioni successive.
mgilson

in python 2x l'uso di map è leggermente più veloce rispetto all'utilizzo di join su una lista di comprensione.
Juan Carlos Moreno

1
Perché il voto negativo, è davvero dovuto alla differenza di velocità tra map()e un generatore? Anche il creatore di Python preferisce le comprensioni e i generatorimap() .
Andrew Clark

Non ti ho votato giù. Conosco quel post di GVR che era il suo modo di dire, allora, come le future versioni di python non lo avrebbero incluso ma, alla fine, sono rimasti.
Juan Carlos Moreno

1
Sono rimasti in Python 3.x, ma il suo punto in quell'articolo è che [F(x) for x in S]è più chiaro di map(F, S). Le prestazioni non sono affrontate lì, ma mi aspetto che la differenza di velocità sia trascurabile. Comunque ero solo confuso per il voto negativo, scusa se pensavo fossi tu!
Andrew Clark

28

Lo uso sempre :

#!/usr/bin/python

l = [1,2,3,7] 
print "".join([str(x) for x in l])

1
Per aggiungere format(), sostituire str(x)con una stringa di formato:print " ".join(["{:02d}".format(x) for x in l])
ChrisFreeman

8

[print(a) for a in list] darà un mucchio di tipi Nessuno alla fine anche se stampa tutti gli elementi


questo è quello che ho usato finora. È una riga, molto chiara ed espressiva, ma linter lamenta "L'espressione non è assegnata a niente"
alete

1
Se vuoi trollare il linter, puoi creare una funzione separata che lo stampa e restituisce un valore stupido e chiama quella funzione nella comprensione della lista
ytpillai

3

Per Python 2. *:

Se sovraccarichi la funzione __str __ () per la tua classe Person, puoi omettere la parte con map (str, ...). Un altro modo per farlo è creare una funzione, proprio come hai scritto:

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

...

write_list(MyList)

C'è in Python 3. * l'argomento sep per la funzione print (). Dai un'occhiata alla documentazione.


3

Espansione della risposta di @ lucasg (ispirata dal commento ricevuto):

Per ottenere un output di elenco formattato , puoi fare qualcosa in questo modo:

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

01, 02, 05

Ora ", "fornisce il separatore (solo tra gli elementi, non alla fine) e la stringa di formattazione '02d'combinata con %xfornisce una stringa formattata per ogni elemento x- in questo caso, formattato come un numero intero con due cifre, riempito a sinistra con zeri.


2

Per visualizzare ogni contenuto, utilizzo:

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

Esempio di utilizzo in una funzione:

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.')

Spero di aver aiutato.


1
Solo come nota, controlla la risposta sopra di te. Usi un intervallo, che fornisce un valore di indice, i, ma usi un'altra variabile, indexval, come tuo indice ?? Stai combattendo contro la semplicità di Python. per val in my_list: print val fa la stessa cosa che hai tu
BretD

1

Penso che questo sia il più conveniente se vuoi solo vedere il contenuto nell'elenco:

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

Semplice, facile da leggere e può essere utilizzato insieme alla stringa di formato.


1

La domanda di OP è: esiste qualcosa come il seguire, se non perché

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

la risposta è, esiste che è:

[p for p in myList] #works perfectly

Fondamentalmente, usa []per la comprensione della lista e sbarazzati di printevitare la stampa None. Per vedere perché le printstampe Nonevedono questo


1

Di recente ho creato un generatore di password e sebbene sia MOLTO NUOVO in python, l'ho creato come un modo per visualizzare tutti gli elementi in un elenco (con piccole modifiche per soddisfare le tue esigenze ...

    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)

Come ho detto, sono MOLTO NUOVO in Python e sono sicuro che questo è un modo per goffo per un esperto, ma sono qui solo per un altro esempio


0

Supponendo che tu stia bene con la stampa della tua lista [1,2,3], un modo semplice in Python3 è:

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

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

L'esecuzione di questo produce il seguente output:

Ci sono 8 elementi in questo elenco di lorem: [1, 2, 3, 'lorem', 'ipsum', 'dolor', 'sit', 'amet']

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.