Usar formato de cadena de Python con listas

112

Construyo una cadena sen Python 2.6.5 que tendrá un número variable de %stokens, 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 estoy tratando de hacer. En este ejemplo, hay tres %stokens y la lista tiene tres entradas.

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

Me gustaría que la cadena de salida sea:

1 BLAH 2 FOO 3 BAR

SabreWolfy
fuente

Respuestas:

112
print s % tuple(x)

en vez de

print s % (x)
infrarrojo
fuente
5
(x)es lo mismo que x. Poner un solo token entre corchetes no tiene sentido en Python. Por lo general, coloca corchetes foo = (bar, )para facilitar la lectura, pero foo = bar,hace exactamente lo mismo.
Patrys
11
print s % (x)es lo que escribió OP, solo lo estaba citando.
infrarrojos
Solo estaba brindando un consejo de idioma, no criticando tu respuesta (de hecho, hice +1 en ella). Tú tampoco foo = (bar, )
escribiste
2
Utilizo la (x)notación para mayor claridad; también evita olvidar los corchetes si luego agrega variables adicionales.
SabreWolfy
¿Qué tal si desea obtener sus variables de varias listas? tupla sólo se necesita una única lista, y el formateador sólo parece tener una única tupla
errant.info
150

Debería echar un vistazo al método de formato de Python. Luego podría definir su cadena de formato de esta manera:

>>> 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'
Cédric Julien
fuente
1
El problema del OP no es el método sino el formato de los parámetros. %El operador solo desempaqueta las tuplas.
patrys
Esto haría la construcción de smás compleja, ya que necesitaría incluir números incrementales en lugar de simplemente %spara cada posición. sse crea en varios pasos diferentes, por lo que es mucho más fácil incluir el %stoken.
SabreWolfy
2
@SabreWolfy Si construye precedurally que entonces puede que le resulte más fácil para nombrar a sus marcadores de posición y utilizar un diccionario para dar formato a la cadena resultante: print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}.
Patrys
2
@SabreWolfy: en Python 2.7, puede omitir los números de campo:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
Pausado hasta nuevo aviso.
Esta respuesta es potencialmente confusa, ya que hace que parezca que los valores numéricos de 0, 1 y 2 están relacionados de alguna manera con el número de veces que aparece la palabra "BLAH".
SabreWolfy
31

Siguiendo esta página de recursos , si la longitud de x varía, podemos usar:

', '.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]
neobot
fuente
1
El enlace ahora está muerto.
MK Hunter
19

Aquí hay un trazador de líneas. Una pequeña respuesta improvisada usando formato con print () para iterar una lista.

¿Qué tal esto (python 3.x):

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

Lea los documentos aquí sobre el uso de format () .

geekidharsh
fuente
18

Como acabo de enterarme de esta cosa interesante (indexar en listas desde una cadena de formato), estoy agregando a esta vieja pregunta.

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

Salida:

1 BLAH 2 FOO 3 BAR

Sin embargo, todavía no he descubierto cómo cortar (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 puede hacer eso.

Joran Beasley
fuente
Tengo un poco de curiosidad acerca de su caso de uso para cortar.
Michael
1
Realmente no tengo uno ... creo que pensé que sería genial poder hacerlo
Joran Beasley
11

¡Esta fue una pregunta divertida! Otra forma de manejar esto para listas de longitud variable es construir una función que aproveche al máximo el .formatmétodo y el desempaquetado de listas. En el siguiente ejemplo, no utilizo ningún formato elegante, pero se puede cambiar 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 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'
Matt P
fuente
3

Lo mismo que la respuesta de @ neobot pero un poco más moderna y concisa.

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'
Ryanjdillon
fuente
0
x = ['1', '2', '3']
s = f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR"
print(s)

La salida es

1 BLAH 2 FOO 3 BAR
arun na
fuente