Come stampare "correttamente" un elenco?


95

Quindi ho una lista:

['x', 3, 'b']

E voglio che l'output sia:

[x, 3, b]

Come posso farlo in Python?

Se lo faccio str(['x', 3, 'b']), ne ottengo uno con virgolette, ma non voglio citazioni.


Per spiegare perché l'elenco non è stampato "correttamente", print(["Sam"])chiama repr("Sam"), che ritorna 'Sam'(con le virgolette), a differenza di quando chiami print("Sam")e Python chiama str("Sam")che ritorna Sam(senza virgolette). Vedi la differenza tra strerepr o Python stre lists per maggiori informazioni.
Anonimo

Risposte:


188

In Python 2:

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

In Python 3 (dove printè una funzione incorporata e non più una funzionalità di sintassi):

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

Entrambi restituiscono:

[x, 3, b]

Questo sta usando la map()funzione per chiamare str per ogni elemento di mylist , creando un nuovo elenco di stringhe che viene poi unito in una stringa con str.join(). Quindi, l' %operatore di formattazione della stringa sostituisce la stringa in anziché %sin "[%s]".


4
Grazie, funziona benissimo. Puoi spiegare un po 'in dettaglio cosa stai facendo nella seconda riga? Sono nuovo in Python.
Obaid

19
Sta usando la mapfunzione per chiamare strogni elemento di mylist, creando un nuovo elenco di stringhe con cui poi si unisce in una stringa str.join. Quindi, utilizza l' %operatore di formattazione della stringa per sostituire la stringa in anziché %sin "[%s]".
li.davidm

6
Un altro modo per farlo forse un po 'più moderno: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor

2
tendo a preferire map(f, xs)(o imapin python2.x) a (f(x) for x in xs)quando fè un chiamabile predefinito; che tende a eseguire meno bytecode e di solito è più compatto. Certamente non è map(lambda x:..., xs) molto peggio di(... for x in xs)
SingleNegationElimination

1
@ user1767754: davvero? Link?
SingleNegationElimination

18

Questo è un codice semplice, quindi se sei nuovo dovresti capirlo abbastanza facilmente.

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

Li stampa tutti senza virgolette, come volevi.


15

Utilizzando solo la stampa:

>>> l = ['x', 3, 'b']
>>> print(*l, sep='\n')
x
3
b
>>> print(*l, sep=', ')
x, 3, b


9

Invece di utilizzare map, consiglierei di utilizzare un'espressione del generatore con la capacità di joinaccettare un iteratore:

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

Ecco joinuna funzione membro della classe string str. Richiede un argomento: un elenco (o iteratore) di stringhe, quindi restituisce una nuova stringa con tutti gli elementi concatenati da, in questo caso ,,.


2
Una buona ottimizzazione per Python 2, poiché map restituisce un elenco in 2.x. Restituisce un generatore in 3.x, quindi non aiuta molto lì.
Tom Zych

7
Vorrei tornare", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem

@eyquem: intelligente, non ho mai visto join usato in questo modo prima. Tuttavia, questo è un po 'più opaco per un principiante (poiché stai usando la proprietà che una stringa è un contenitore iterabile di stringhe di un carattere).
Seth Johnson,

6

È possibile eliminare tutti i caratteri indesiderati da una stringa utilizzando il suo translate()metodo con Nonecome tableargomento seguito da una stringa contenente i caratteri che si desidera rimuovere per il suo deletecharsargomento.

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

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

# [x, 3, b]

Se stai usando una versione di Python precedente alla 2.6, dovrai invece usare la funzione stringdel modulo translate()perché la possibilità di passare Nonecome tableargomento non è stata aggiunta fino a Python 2.6. Usandolo assomiglia a questo:

import string

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

L'uso della string.translate()funzione funzionerà anche nella versione 2.6+, quindi potrebbe essere preferibile utilizzarla.


2
Ahimè: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]e anche conlst = ['it isn\'t', 3, 'b']
eyquem

1
@eyquem: Sì, evitare la cancellazione di caratteri che fanno effettivamente parte dei tuoi dati (piuttosto che essere usati rigorosamente per delimitarli) richiederebbe naturalmente una logica leggermente più elaborata / diversa se possibile.
martineau

3

Ecco una sessione interattiva che mostra alcuni passaggi nell'unica riga di @ TokenMacGuy. Per prima cosa usa la mapfunzione per convertire ogni elemento nell'elenco in una stringa (in realtà, sta creando un nuovo elenco, non convertendo gli elementi nel vecchio elenco). Quindi sta usando il metodo delle stringhe joinper combinare quelle stringhe ', 'tra di loro. Il resto è solo la formattazione delle stringhe, che è piuttosto semplice. (Modifica: questa istanza è semplice; la formattazione delle stringhe in generale può essere piuttosto complessa.)

Si noti che l'uso joinè un modo semplice ed efficiente per costruire una stringa da diverse sottostringhe, molto più efficiente rispetto a farlo aggiungendo successivamente stringhe alle stringhe, il che comporta molte copie dietro le quinte.

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

2

Usando .formatper la formattazione delle stringhe,

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

Produzione:

[x, 3, b]

Spiegazione:

  1. mapviene utilizzato per mappare ogni elemento dell'elenco al stringtipo.
  2. Gli elementi vengono uniti in una stringa con ,separatore.
  3. Usiamo [e ]nell'istruzione print per mostrare le parentesi graffe dell'elenco.

Riferimento: .formatper la formattazione delle stringhe PEP-3101


Grande! Trovo che usi .formatil modo più pitonico. Ma, ovviamente, accetto i disaccordi. ;)
amato da Gesù il

0

Sono stato ispirato da @AniMenon a scrivere una soluzione pitonica più generale.

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

Utilizza solo il formatmetodo. Nessuna traccia stre consente la regolazione fine del formato degli elementi. Ad esempio, se hai numeri in virgola mobile come elementi dell'elenco, puoi regolare il loro formato, aggiungendo uno specificatore di conversione, in questo caso:.2f

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

L'output è abbastanza decente:

[1.85, -6.33, 4000.21]
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.