web-dev-qa-db-fra.com

Python formatage de chaîne avec signe de pourcentage

J'essaie de faire exactement ce qui suit:

>>> x = (1,2)
>>> y = 'hello'
>>> '%d,%d,%s' % (x[0], x[1], y)
'1,2,hello'

Cependant, j'ai un long x, plus de deux éléments, j'ai donc essayé:

>>> '%d,%d,%s' % (*x, y)

mais c'est une erreur de syntaxe. Quelle serait la bonne façon de procéder sans indexation comme le premier exemple?

17
Sait

str % .. accepte un Tuple comme opérande de droite, vous pouvez donc effectuer les opérations suivantes:

>>> x = (1, 2)
>>> y = 'hello'
>>> '%d,%d,%s' % (x + (y,))  # Building a Tuple of `(1, 2, 'hello')`
'1,2,hello'

Votre essai devrait fonctionner dans Python 3. où Additional Unpacking Generalizations est pris en charge, mais pas dans Python 2.x:

>>> '%d,%d,%s' % (*x, y)
'1,2,hello'
22
falsetru

Jetez un œil à str.format () .

>>> x = (5,7)
>>> template = 'first: {}, second: {}'
>>> template.format(*x)
'first: 5, second: 7'

Mise à jour:

Pour être complet, j'inclus également généralisations de déballage supplémentaires décrites par PEP 448 . La syntaxe étendue a été introduite dans Python 3.5 , et ce qui suit n'est plus une erreur de syntaxe:

>>> x = (5, 7)
>>> y = 42
>>> template = 'first: {}, second: {}, last: {}'
>>> template.format(*x, y)  # valid in Python3.5+
'first: 5, second: 7, last: 42'

Dans Python 3.4 et inférieur , cependant, si vous voulez passer des arguments supplémentaires après le tuple décompressé, il vaut probablement mieux les passer comme arguments nommés:

>>> x = (5, 7)
>>> y = 42
>>> template = 'first: {}, second: {}, last: {last}'
>>> template.format(*x, last=y)
'first: 5, second: 7, last: 42'

Cela évite d'avoir à construire un nouveau Tuple contenant un élément supplémentaire à la fin.

10
plamut

Je vous suggère d'utiliser str.format au lieu str % car il est "plus moderne" et possède également un meilleur ensemble de fonctionnalités. Cela dit, ce que vous voulez, c'est:

>>> x = (1,2)
>>> y = 'hello'
>>> '{},{},{}'.format(*(x + (y,)))
1,2,hello

Pour toutes les fonctionnalités intéressantes de format (et certaines liées à % également) jetez un œil à PyFormat .

2
Fabio Menegazzo