2009-08-04 22 views
85

I tienen una cadena de esta formaInsertar el mismo valor varias veces al formatear una cadena

s='arbit' 
string='%s hello world %s hello world %s' %(s,s,s) 

Todo el% s en la cadena tienen el mismo valor (es decir, s). ¿Hay alguna forma mejor de escribir esto? (En vez de listar a cabo tres veces s)

+0

Duplicado: http://stackoverflow.com/questions/543399/python-string-formatting – bignose

+2

Este operador de cadena '%' estará "en desuso en Python 3.1 y eliminado más adelante en algún momento" http: //docs.python .org/release/3.0.1/whatsnew/3.0.html # pep-3101-a-new-approach-to-string-formatting ahora me pregunto cuál es la forma más recomendada para la compatibilidad y la seguridad de la versión. – cregox

+2

@Cawas Sé que esto es bastante tarde, pero me gusta usar 'str.format()'. Ej .: 'query =" SELECT * FROM {named_arg} "; query.format (** kwargs) ', donde' query' es la cadena de formato y 'kwargs' es un diccionario con claves que coinciden con' named_arg's en la cadena de formato. – Edwin

Respuesta

154

Puede utilizar advanced string formatting, disponible en Python 2.6 y 3.x Python:

incoming = 'arbit' 
result = '{0} hello world {0} hello world {0}'.format(incoming) 
+5

~ mi preferencia personal, ve por estilo kwargs 'result = '{st} hola world {st} hello world {st} '. format (st = incoming) ' – nehemiah

35
incoming = 'arbit' 
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming} 

Es posible que quiera tener una lectura de esto para conseguir una comprensión: String Formatting Operations.

+1

Agradable. Se había olvidado de esto los lugareños() también lo harán. – Goutham

+1

@Goutham: la respuesta de Adam Rosenfield podría ser mejor si su versión de Python está actualizada. – mhawke

+0

Es en realidad. Todavía me estoy acostumbrando a las nuevas operaciones de formato de cadenas. – Goutham

13

Puede utilizar el tipo de diccionario de formato:

s='arbit' 
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,} 
+1

Parece que tiene muy poco sentido proporcionar esta respuesta duplicada. Aquí hay otro: '% (string_goes_here) s hello world% (string_goes_here) s hello world% (string_goes_here) s'% {'string_goes_here': s,}. Hay prácticamente un número infinito de posibilidades. – mhawke

+3

mhawke: publiqué el mensaje antes de que mi navegador vuelva a cargar la página, así que no supe en ese momento que la pregunta ya estaba respondida. ¡No necesitas ser grosero! –

+2

@Lucas: Supongo que es posible que haya tardado 13 minutos en escribir su respuesta :) y gracias por el voto negativo ... muy apreciado. – mhawke

11

depende de lo que entendemos por una mejor. Esto funciona si su objetivo es la eliminación de la redundancia.

s='foo' 
string='%s bar baz %s bar baz %s bar baz' % (3*(s,)) 
3
>>> s1 ='arbit' 
>>> s2 = 'hello world '.join([s]*3) 
>>> print s2 
arbit hello world arbit hello world arbit 
+0

Supongo que el ejemplo en la pregunta no era sobre 'hola mundo' repetido, sino una plantilla real sin duplicación. Por eso bajé la votación. – Gra

0

Fstrings

Si está utilizando Python 3.6+ se puede hacer uso de la nueva llamada f-strings que significa cadenas con formato y puede ser utilizado por la adición del carácter f en el comienzo de una cadena para identificar esto como f-string.

price = 123 
name = "Jerry" 
print(f"{name}!!, {price} is much, isn't {price} a lot? {name}!") 
>Jerry!!, 123 is much, isn't 123 a lot? Jerry! 

Los principales beneficios del uso de los F-cuerdas es que son más legibles, puede ser más rápido, y ofrecen un mejor rendimiento:

pandas Fuente para todos: Análisis de datos de Python, de Daniel Y. Chen

puntos de referencia

no hay duda de que el nuevo f-strings son más fácil de leer, ya que no tiene que volver a asignar las cuerdas, b ¿Pero es más rápido como se indica en la cita mencionada?

price = 123 
name = "Jerry" 

def new(): 
    x = f"{name}!!, {price} is much, isn't {price} a lot? {name}!" 


def old(): 
    x = "{1}!!, {0} is much, isn't {0} a lot? {1}!".format(price, name) 

import timeit 
print(timeit.timeit('new()', setup='from __main__ import new', number=10**7)) 
print(timeit.timeit('old()', setup='from __main__ import old', number=10**7)) 
> 3.8741058271543776 #new 
> 5.861819514350163 #old 

Ejecución de 10 millones de pruebas de que parece que el nuevo f-strings son en realidad más rápido en la cartografía.

Cuestiones relacionadas