2013-04-02 4 views
71

vorrei sapere se c'è un modo migliore per stampare tutti gli oggetti in una lista Python di questo:modo Pythonic per stampare le voci di elenco

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

ho letto in questo modo non è veramente buono:

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

non c'è qualcosa di simile:

print(p) for p in myList 

In caso contrario, la mia domanda è ... perchè? Se possiamo fare questo genere di cose con liste complete, perché non come una semplice affermazione fuori da una lista?

+2

Dove hai avuto l'impressione che l'uso di 'for p in myList' non fosse" non proprio buono "? –

+0

guardando la tua prima versione - scommetto che eri programmatore perl nella vita precedente ;-) – pelotasplus

+0

@JonClements: http://chrisarndt.de/talks/rupy/2008/output/slides.html –

risposta

136

si Supponendo che sta utilizzando Python 3.x:

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

si può ottenere lo stesso comportamento su Python 2.x utilizzando from __future__ import print_function, come notato da mgilson nei commenti.

Con la dichiarazione di stampa su Python 2.x è necessario iterazione di qualche tipo, per quanto riguarda le tue domande su print(p) for p in myList non funziona, si può semplicemente utilizzare il seguente, che fa la stessa cosa, ed è ancora una riga:

for p in myList: print p 

Per una soluzione che utilizza '\n'.join(), preferisco list comprehension e generatori oltre map() quindi mi sarebbe probabilmente utilizzare il seguente:

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

E se no, puoi 'da __future__ import print_function' su python2.6 e successivi. – mgilson

+0

in python 2x utilizzando la mappa è leggermente più veloce dell'utilizzo di join su una lista di comprensione. –

+0

Perché il downvote, è davvero dovuto alla differenza di velocità tra 'map()' e un generatore? [Il creatore di Python capita anche di preferire comprensioni e generatori su 'map()'] (http://www.artima.com/weblogs/viewpost.jsp?thread=98196). –

21

io lo uso per tutto il tempo:

#!/usr/bin/python 

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

Grazie a questo aspetto migliore di quello che ho :) –

+1

Grande, sai dove posizionare 'format()' per formattare l'output? '% 02d' p.e. – Reman

+0

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

3

Per Python 2. *:

Se si esegue l'overload la funzione __str __() per la classe persona, è possibile omettere la parte con la mappa (str, ...). Un altro modo per questo è la creazione di 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 settembre per la funzione di stampa(). Dai un'occhiata alla documentazione.

4

[print(a) for a in list] darà un sacco di tipi Nessuno alla fine anche se esso stampa fuori tutti gli articoli

1

Espansione @ risposta di lucasg (ispirato dal commento che ha ricevuto):

Per ottenere un formattata lista di output, si può fare qualcosa in queste righe:

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

01, 02, 05 

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

0

per visualizzare ogni contenuto, io uso:

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

Speranza ho aiutato.

+0

Just come nota, si prega di controllare la risposta sopra di voi. Si utilizza un intervallo, che fornisce un valore di indice, io, tuttavia si utilizza un'altra variabile, indexval, come indice ?? Stai combattendo contro la semplicità di Python. per val in my_list: print val fa lo stesso di quello che hai – BretD