2010-11-29 4 views
28

Si je veux faire ma chaîne formatée dynamiquement réglable, je changerai le code suivant deChaîne de format dynamique

print '%20s : %20s' % ("Python", "Very Good") 

à

width = 20 
print ('%' + str(width) + 's : %' + str(width) + 's') % ("Python", "Very Good") 

Cependant, il semble que la concaténation de chaîne est lourd ici. Un autre moyen de le simplifier?

Répondre

21

Vous pouvez récupérer la valeur de remplissage de la liste des arguments:

print '%*s : %*s' % (20, "Python", 20, "Very Good") 

Vous pouvez même insérer les valeurs de remplissage dynamique:

width = 20 
args = ("Python", "Very Good") 
padded_args = zip([width] * len(args), args) 
# Flatten the padded argument list. 
print "%*s : %*s" % tuple([item for list in padded_args for item in list]) 
5
print '%*s : %*s' % (width, 'Python', width, 'Very Good') 
+0

+1 Ceci est une meilleure réponse que la mienne. Je regardais les fonctions justes et correctes pour faire cela. – pyfunc

1

Si vous ne voulez pas préciser le Larges en même temps, vous pouvez préparer une chaîne de format à l'avance, comme vous le faisiez - mais avec une autre substitution. Nous utilisons %% pour échapper les signes% réels dans une chaîne. Nous voulons finir avec %20s dans notre chaîne de format quand la largeur est 20, ainsi nous employons %%%ds et fournissons la variable de largeur pour substituer là. Les deux premiers signes% deviennent littéraux%, puis% d est substituée par la variable.

Ainsi:

format_template = '%%%ds : %%%ds' 
# later: 
width = 20 
formatter = format_template % (width, width) 
# even later: 
print formatter % ('Python', 'Very Good') 
+1

J'aime cela comme un moyen de générer dynamiquement des chaînes de format en général. Cependant, l'approche de M. Hamidi est meilleure si seulement les largeurs de champ doivent être interpolées dynamiquement. –

28

Vous pouvez le faire en utilisant la méthode str.format().

>>> width = 20 
>>> print("{:>{width}} : {:>{width}}".format("Python", "Very Good", width=width)) 
       Python :   Very Good 

A partir de Python 3.6, vous pouvez utiliser f-string pour ce faire:

In [579]: lang = 'Python' 

In [580]: adj = 'Very Good' 

In [581]: width = 20 

In [582]: f'{lang:>{width}}: {adj:>{width}}' 
Out[582]: '    Python:   Very Good' 
+0

Merci d'avoir ajouté la solution f-strings! – Sebastiaan