web-dev-qa-db-fra.com

Insérer la même valeur plusieurs fois lors du formatage d'une chaîne

J'ai une ficelle de cette forme

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

Tous les% s dans la chaîne ont la même valeur (c.-à-d. S). Y a-t-il une meilleure façon d'écrire cela? (Plutôt que d'énumérer trois fois)

101
Goutham

Vous pouvez utiliser formatage de chaîne avancé , disponible dans Python 2.6 et Python 3.x:

incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)
187
Adam Rosenfield
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

Vous aimerez peut-être lire ceci pour mieux comprendre: Opérations de formatage de chaîne .

39
mhawke

Vous pouvez utiliser le type de formatage du dictionnaire:

s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}
14
Lucas S.

Cela dépend de ce que vous entendez par meilleur. Cela fonctionne si votre objectif est la suppression de la redondance.

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

Fstrings

Si vous utilisez Python 3.6+ vous pouvez utiliser le nouveau fichier appelé f-strings, qui représente les chaînes formatées, peut être utilisé en ajoutant le caractère f au début d’une chaîne pour l’identifier comme chaîne f .

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!

Les principaux avantages de l'utilisation des chaînes de caractères f sont qu'elles sont plus lisibles, plus rapides et offrent de meilleures performances:

Source Pandas pour tout le monde: Python Analyse des données, par Daniel Y. Chen

Des repères

Nul doute que le nouveau f-strings sont plus lisibles, car vous n'avez pas besoin de remapper les chaînes, mais est-ce plus rapide, comme indiqué dans la citation susmentionnée?

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

En exécutant 10 millions de tests, il semble que le nouveau f-strings sont en fait plus rapides dans la cartographie.

1
user1767754