Utilizzo della formattazione di stringhe Python con gli elenchi


112

Costruisco una stringa sin Python 2.6.5 che avrà un numero variabile di %stoken, che corrispondono al numero di voci nell'elenco x. Ho bisogno di scrivere una stringa formattata. Quanto segue non funziona, ma indica cosa sto cercando di fare. In questo esempio, ci sono tre %stoken e l'elenco ha tre voci.

s = '%s BLAH %s FOO %s BAR'
x = ['1', '2', '3']
print s % (x)

Vorrei che la stringa di output fosse:

1 BLAH 2 FOO 3 BAR

Risposte:


112
print s % tuple(x)

invece di

print s % (x)

5
(x)è la stessa cosa di x. Mettere un singolo token tra parentesi non ha alcun significato in Python. Di solito inserisci parentesi foo = (bar, )per renderlo più facile da leggere, ma foo = bar,fa esattamente la stessa cosa.
patrys

11
print s % (x)è quello che ha scritto OP, stavo solo citando lui / lei.
infrarossi

Stavo solo fornendo un suggerimento in lingua, non criticando la tua risposta (in effetti ho fatto +1). Non hai scritto foo = (bar, )neanche :)
patrys

2
Uso la (x)notazione per chiarezza; evita anche di dimenticare le parentesi se si aggiungono successivamente ulteriori variabili.
SabreWolfy

Che ne dici se desideri ottenere le tue variabili da più elenchi? tuple accetta solo un singolo elenco e il formattatore sembra prendere solo una singola tupla
errant.info

150

Dovresti dare un'occhiata al metodo di formattazione di python. È quindi possibile definire la stringa di formattazione in questo modo:

>>> s = '{0} BLAH BLAH {1} BLAH {2} BLAH BLIH BLEH'
>>> x = ['1', '2', '3']
>>> print s.format(*x)
'1 BLAH BLAH 2 BLAH 3 BLAH BLIH BLEH'

1
Il problema dell'OP non è il metodo ma il formato dei parametri. %L'operatore decomprime solo le tuple.
patrys

Ciò renderebbe la costruzione di spiù complessa, poiché avrei bisogno di includere numeri incrementali piuttosto che semplicemente %sper ciascuna posizione. sè costruito in una serie di passaggi diversi, quindi è molto più facile includere solo il %stoken.
SabreWolfy

2
@SabreWolfy Se si costruisce lo precedurally allora si potrebbe trovare più facile assegnare un nome al segnaposto e utilizzare un dict per formattare la stringa risultante: print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}.
patrys

2
@SabreWolfy: In Python 2.7, puoi omettere i numeri di campo:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
In pausa fino a nuovo avviso.

Questa risposta è potenzialmente fonte di confusione, in quanto fa sembrare che i valori numerici di 0, 1 e 2 siano in qualche modo correlati al numero di volte in cui appare la parola "BLAH".
SabreWolfy

31

Seguendo questa pagina delle risorse , se la lunghezza di x varia, possiamo usare:

', '.join(['%.2f']*len(x))

per creare un segnaposto per ogni elemento dell'elenco x. Ecco l'esempio:

x = [1/3.0, 1/6.0, 0.678]
s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x)
print s
>>> elements in the list are [0.33, 0.17, 0.68]

1
Il collegamento ora è morto.
MK Hunter

19

Ecco un one liner. Una piccola risposta improvvisata usando format con print () per iterare un elenco.

Che ne dici di questo (python 3.x):

sample_list = ['cat', 'dog', 'bunny', 'pig']
print("Your list of animals are: {}, {}, {} and {}".format(*sample_list))

Leggi i documenti qui sull'uso di format () .


18

Dato che ho appena appreso di questa cosa interessante (indicizzazione in elenchi dall'interno di una stringa di formato), sto aggiungendo questa vecchia domanda.

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR'
x = ['1', '2', '3']
print (s.format (x=x))

Produzione:

1 BLAH 2 FOO 3 BAR

Tuttavia, non ho ancora capito come eseguire lo slicing (all'interno della stringa di formato '"{x[2:4]}".format...) e mi piacerebbe capirlo se qualcuno ha un'idea, tuttavia sospetto che semplicemente non puoi farlo.


Sono un po 'curioso del tuo caso d'uso per l'affettatura.
Michael

1
Non ne ho davvero uno ... penso di aver pensato che sarebbe stato carino poterlo fare
Joran Beasley

11

Questa è stata una domanda divertente! Un altro modo per gestire questo problema per gli elenchi di lunghezza variabile è creare una funzione che sfrutti appieno il .formatmetodo e lo spacchettamento degli elenchi. Nell'esempio seguente non utilizzo alcuna formattazione di fantasia, ma può essere facilmente modificata in base alle proprie esigenze.

list_1 = [1,2,3,4,5,6]
list_2 = [1,2,3,4,5,6,7,8]

# Create a function that can apply formatting to lists of any length:
def ListToFormattedString(alist):
    # Create a format spec for each item in the input `alist`.
    # E.g., each item will be right-adjusted, field width=3.
    format_list = ['{:>3}' for item in alist] 

    # Now join the format specs into a single string:
    # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
    s = ','.join(format_list)

    # Now unpack the input list `alist` into the format string. Done!
    return s.format(*alist)

# Example output:
>>>ListToFormattedString(list_1)
'  1,  2,  3,  4,  5,  6'
>>>ListToFormattedString(list_2)
'  1,  2,  3,  4,  5,  6,  7,  8'

3

La stessa della risposta di @neobot ma un po 'più moderna e succinta.

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'

0
x = ['1', '2', '3']
s = f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR"
print(s)

L'output è

1 BLAH 2 FOO 3 BAR
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.