2011-03-14 11 views
9

Asumir esta variable:Cómo lista (o tupla) utiliza como valor de formato de cadenas

s=['Python', 'rocks'] 
x = '%s %s' % (s[0], s[1]) 

Ahora me gustaría sustituir lista mucho más larga, y la adición de todos los valores de la lista por separado, al igual que s [0], s [1], ... s [n], no parece correcto

Presupuesto de documentación:

Dados los valores de% de formato ... Si el formato requiere un solo argumento, los valores pueden ser un solo obj no tuple ect. [4] De lo contrario, los valores deben ser una tupla con exactamente el número de elementos especificados mediante la cadena de formato o un solo objeto de asignación (por ejemplo, un diccionario ).

He intentado muchas combinaciones con tuplas y listas como formateadores pero sin éxito, así que pensé que pedir aquí

espero que sea clara

[editar] OK, tal vez no estaba clara lo suficientemente

tengo variable de texto grande, como

s = ['a', 'b', ..., 'z'] 

x = """some text block 
      %s 
      onother text block 
      %s 
      ... end so on... 
      """ % (s[0], s[1], ... , s[26]) 

I wo ULD gustaría cambiar % (s[0], s[1], ... , s[26]) más compacta sin introducir todos los valores a mano

Respuesta

28

Usted no tiene que explicar todos los índices:

s = ['language', 'Python', 'rocks'] 
some_text = "There is a %s called %s which %s." 
x = some_text % tuple(s) 

el número de elementos de s tiene que ser el mismo que el número de puntos de inserción en la cadena de formato, por supuesto.

Desde 2.6 también se puede utilizar el nuevo método format, por ejemplo:

x = '{} {}'.format(*s) 
+0

Ah, 'tuple (s)' ... gracias. Esto resolvió el caso – Ghostly

+1

Con el operador '%' desaprobado en python 3, debe comenzar utilizando el método 'format' en su lugar:' x = "{0} {1}". Format (* s) '. 'join' es la mejor solución en este caso, por supuesto .. –

0

No es cómo unirse a los miembros de tupla:

x = " ".join(YourTuple) 

espacio es los miembros de su tupla separador

1

Si desea utilizar una lista de elementos, sólo puede pasar una tupla directamente:

s = ['Python', 'rocks'] 
x = '%s %s' % tuple(s) 

O puede utilizar una diccionario para hacer su lista anterior:

s = {'first':'python', 'second':'rocks'} 
x = '%(first)s %(second)s' % s 
-1

Comprobar el siguiente ejemplo

Lista Ejemplo

data = ["John", "Doe", 53.44] 
format_string = "Hello" 

print "Hello %s %s your current balance is %d$" % (data[0],data[1],data[2]) 

Hola John Doe su saldo actual es de 53 $

ejemplo Tupla

data = ("John", "Doe", 53.44) 
format_string = "Hello" 

print "Hello %s %s your current balance is %d$" % (data[0],data[1],data[2]) 

Hola John Doe su saldo actual es de 53 $

1

aumentando la respuesta de @yan para el nuevo método .format, si uno tiene un diccionario con más de un valor para una clave, use índice con clave para acceder a valores diferentes.

>>> s = {'first':['python','really'], 'second':'rocks'} 
>>> x = '{first[0]} --{first[1]}-- {second}'.format(**s) 
>>> x 
'python --really-- rocks' 

precaución: Su poco diferente cuando se tiene que acceder a uno de los valores clave contra un independiente de .formato(), que dice así:

>>> value=s['first'][i] 
0

Hablar es barato, que el espectáculo código:

>>> tup = (10, 20, 30) 
>>> lis = [100, 200, 300] 
>>> num = 50 
>>> print '%d  %s'%(i,tup) 
50  (10, 20, 30) 
>>> print '%d  %s'%(i,lis) 
50  [100, 200, 300] 
>>> print '%s'%(tup,) 
(10, 20, 30) 
>>> print '%s'%(lis,) 
[100, 200, 300] 
>>> 
0

Si usted es serio acerca de la inyección de un máximo de 26 cuerdas en su formato, es posible que desee considerar el nombramiento de los marcadores de posición. De lo contrario, alguien que mire su código no tendrá idea de qué es s[17].

fields = { 
    'username': 'Ghostly', 
    'website': 'Stack Overflow', 
    'reputation': 6129, 
} 

fmt = ''' 
Welcome back to {website}, {username}! 
Your current reputation sits at {reputation}. 
''' 

output = fmt.format(**fields) 

Para estar seguro, puede continúa utilizando una lista y ampliarlo como el fin del Jochen Ritzel's answer, pero eso es más difícil de mantener para las estructuras más grandes. Solo puedo imaginarme cómo se vería con 26 de los marcadores de posición {}.

fields = [ 
    'Ghostly', 
    'Stack Overflow', 
    6129, 
] 

fmt = ''' 
Welcome back to {}, {}! 
Your current reputation sits at {}. 
''' 

output = fmt.format(*fields) 
Cuestiones relacionadas