2011-09-27 15 views
61

Construyo una cadena s en Python 2.6.5 que tendrá un número variable de tokens %s, que coinciden con el número de entradas en la lista x. Necesito escribir una cadena formateada. Lo siguiente no funciona, pero indica lo que intento hacer. En este ejemplo, hay tres tokens %s y la lista tiene tres entradas.Uso del formato de cadena de Python con listas

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

me gustaría la cadena de salida sea:

1 BLAH 2 FOO 3 BAR

Respuesta

17

Después de esta resource page, si la longitud de x es variable, podemos utilizar:

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

para crear un marcador de posición para cada elemento de la lista x. Aquí está el ejemplo:

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) 

en lugar de

print s % (x) 
+2

'(x)' es lo mismo que 'x'. Poner un solo token entre corchetes no tiene ningún significado en Python. Por lo general, coloca los paréntesis en 'foo = (bar,)' para que sea más fácil de leer, pero 'foo = bar,' hace exactamente lo mismo. – patrys

+6

'print s% (x)' es lo que OP escribió, solo lo estaba citando. – infrared

+0

Solo le estaba dando un consejo sobre el idioma, no criticando su respuesta (de hecho, lo hice +1).No escribió 'foo = (bar,)' tampoco :) – patrys

99

Usted debe echar un vistazo a la forma de pitón format. A continuación, podría definir su cadena de formato como esto:

>>> 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

Python 2.6+ solamente. – agf

+1

OP utiliza 2.6.5 -> ok – glglgl

+1

El problema de OP no es el método sino el formato de los parámetros. El operador '%' solo descomprime tuplas. – patrys

11

Desde que acabo de aprender acerca de esta cosa fresca (indexación en listas de dentro de una cadena de formato) que estoy añadiendo a esta vieja pregunta.

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

Sin embargo, todavía no he encontrado la manera de hacer el corte en lonchas (dentro de la cadena de formato '"{x[2:4]}".format...,) y me encantaría averiguarlo si alguien tiene una idea, sin embargo sospecho que simplemente no se puede hacer ese.

+0

Tengo un poco de curiosidad acerca de su caso de uso para cortar. – Michael

+0

realmente no tengo uno ... creo que pensé que sería genial poder hacer –

4

¡Esta fue una pregunta divertida! Otra forma de manejar esto con el método .format para listas de longitud variable es usar una función que aproveche al máximo el desempaquetado de listas. En el siguiente ejemplo, no utilizo ningún formato elegante, pero puede cambiarse fácilmente para adaptarlo a sus necesidades.

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

y también es posible en python 3.6+ hacer:

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

He aquí una pequeña respuesta improvisada a usar el formato de impresión() en una lista.

¿Qué tal esto: (AP3)

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

Leer los documentos aquí sobre el uso de format.

Cuestiones relacionadas