2011-09-27 21 views
61

Costruisco una stringa s in Python 2.6.5 che avrà un numero variabile di token %s, che corrisponde al numero di voci nell'elenco x. Devo scrivere una stringa formattata. Quanto segue non funziona, ma indica ciò che sto cercando di fare. In questo esempio, ci sono tre token %s e l'elenco ha tre voci.Utilizzo della formattazione di stringhe Python con elenchi

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

mi piacerebbe la stringa di output di essere:

1 BLAH 2 FOO 3 BAR

risposta

17

A seguito di questa resource page, se la lunghezza di x è variabile, possiamo usare:

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

per creare un segnaposto per ogni elemento dal lista 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] 
74
print s % tuple(x) 

invece di

print s % (x) 
+2

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

+6

'print s% (x)' è ciò che OP ha scritto, stavo solo citandolo. – infrared

+0

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

99

Si dovrebbe dare un'occhiata al metodo di pitone format. Si potrebbe quindi definire la stringa di formattazione in questo modo:

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

solo Python 2.6+. – agf

+1

OP utilizza 2.6.5 -> ok – glglgl

+1

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

11

Da quando ho appena saputo di questa cosa fredda (indicizzazione in elenchi all'interno di una stringa di formato) Sto aggiungendo a questa vecchia domanda.

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

Tuttavia, non ho ancora capito come fare per affettare (all'interno della stringa di formato '"{x[2:4]}".format...,) e mi piacerebbe capire se qualcuno ha un'idea, ma ho il sospetto che semplicemente non si può fare quella.

+0

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

+0

non ne ho davvero uno ... penso di aver pensato che sarebbe stato bello poter fare –

4

Questa è stata una domanda divertente! Un altro modo per gestirlo con il metodo .format per gli elenchi di lunghezza variabile consiste nell'utilizzare una funzione che sfrutta appieno l'estrazione della lista. Nell'esempio seguente non utilizzo alcuna formattazione elaborata, 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 to easily repeat on many lists: 
def ListToFormattedString(alist): 
    # Each item is right-adjusted, width=3 
    formatted_list = ['{:>3}' for item in alist] 
    s = ','.join(formatted_list) 
    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' 
-1

ed inoltre è possibile in python 3.6+ fare:

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

Ecco un po 'di risposta improvvisata per utilizzando il formato con print() in un elenco.

ne dite di questo: (PY3)

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

leggere la documentazione qui sull'utilizzo format.

Problemi correlati