159 votes

Comment imprimer une chaîne de caractères à une largeur fixe ?

J'ai ce code (imprimer l'occurrence de toutes les permutations dans une chaîne de caractères)

def splitter(str):
    for i in range(1, len(str)):
        start = str[0:i]
        end = str[i:]
        yield (start, end)
        for split in splitter(end):
            result = [start]
            result.extend(split)
            yield result    

el =[];

string = "abcd"
for b in splitter("abcd"):
    el.extend(b);

unique =  sorted(set(el));

for prefix in unique:
    if prefix != "":
        print "value  " , prefix  , "- num of occurrences =   " , string.count(str(prefix));

Je veux imprimer toutes les occurrences de permutation qu'il y a dans la chaîne varaible.

Puisque la permutation n'est pas de la même longueur, je veux fixer la largeur et l'imprimer dans un joli format comme celui-ci :

value   a - num of occurrences =    1
value   ab - num of occurrences =    1
value   abc - num of occurrences =    1
value   b - num of occurrences =    1
value   bc - num of occurrences =    1
value   bcd - num of occurrences =    1
value   c - num of occurrences =    1
value   cd - num of occurrences =    1
value   d - num of occurrences =    1

Comment puis-je utiliser format pour le faire ?

J'ai trouvé ces postes mais ça ne va pas avec les chaînes alphanumériques :

python string formatting fixed width

Définir une longueur fixe avec python

268voto

0x90 Points 8193

Je trouve qu'utiliser str.format beaucoup plus élégant :

>>> '{0: <5}'.format('s')
's    '
>>> '{0: <5}'.format('ss')
'ss   '
>>> '{0: <5}'.format('sss')
'sss  '
>>> '{0: <5}'.format('ssss')
'ssss '
>>> '{0: <5}'.format('sssss')
'sssss'

Dans le cas où vous voulez aligner la chaîne vers la droite, utilisez > au lieu de < :

>>> '{0: >5}'.format('ss')
'   ss'

Edit 1 : Comme mentionné dans les commentaires : le 0 en '{0: <5}' indique l'index de l'argument passé à str.format() .


Edit 2 : En python3, on pouvait aussi utiliser des chaînes f :

sub_str='s'
for i in range(1,6):
    s = sub_str*i
    print(f'{s:>5}')

'    s'
'   ss'
'  sss'
' ssss'
'sssss'

ou :

for i in range(1,5):
    s = sub_str*i
    print(f'{s:<5}')
's    '
'ss   '
'sss  '
'ssss '
'sssss'

à noter, dans certains endroits ci-dessus, ' ' (guillemets simples) ont été ajoutés pour souligner la largeur des chaînes imprimées.

134voto

mac Points 16282

MODIFIER 2013-12-11 - Cette réponse est très ancienne. Elle est toujours valable et correcte, mais les personnes qui la consultent devraient préférer la réponse suivante nouvelle syntaxe de format .

Vous pouvez utiliser formatage des chaînes comme ça :

>>> print '%5s' % 'aa'
   aa
>>> print '%5s' % 'aaa'
  aaa
>>> print '%5s' % 'aaaa'
 aaaa
>>> print '%5s' % 'aaaaa'
aaaaa

En gros :

  • el % informe python qu'il devra substituer quelque chose à un jeton
  • el s indique à python que le jeton sera une chaîne de caractères.
  • el 5 (ou n'importe quel nombre que vous souhaitez) indique à python de remplir la chaîne avec des espaces jusqu'à 5 caractères.

Dans votre cas spécifique, une mise en œuvre possible pourrait ressembler à ceci :

>>> dict_ = {'a': 1, 'ab': 1, 'abc': 1}
>>> for item in dict_.items():
...     print 'value %3s - num of occurances = %d' % item # %d is the token of integers
... 
value   a - num of occurances = 1
value  ab - num of occurances = 1
value abc - num of occurances = 1

NOTA BENE : Je me demandais juste si vous étiez au courant de l'existence du itertools module . Par exemple, vous pouvez obtenir une liste de toutes vos combinaisons en une seule ligne avec :

>>> [''.join(perm) for i in range(1, len(s)) for perm in it.permutations(s, i)]
['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'ba', 'bc', 'bd', 'ca', 'cb', 'cd', 'da', 'db', 'dc', 'abc', 'abd', 'acb', 'acd', 'adb', 'adc', 'bac', 'bad', 'bca', 'bcd', 'bda', 'bdc', 'cab', 'cad', 'cba', 'cbd', 'cda', 'cdb', 'dab', 'dac', 'dba', 'dbc', 'dca', 'dcb']

et vous pouvez obtenir le nombre d'occurrences en utilisant combinations en collaboration avec count() .

103voto

joelostblom Points 7189

Posté à l'origine comme une modification de la réponse de @0x90, mais il a été rejeté pour avoir dévié de l'intention originale du post et recommandé de le poster comme un commentaire ou une réponse, donc j'inclus le court résumé ici.

En plus de la réponse de @0x90, la syntaxe peut être rendue plus flexible, en utilisant une variable pour la largeur (comme dans le commentaire de @user2763554) :

width=10
'{0: <{width}}'.format('sss', width=width)

De plus, vous pouvez rendre cette expression plus brève, en n'utilisant que des nombres et en vous basant sur l'ordre des arguments passés à la commande format :

width=10
'{0: <{1}}'.format('sss', width)

Ou même ne pas tenir compte de tous les chiffres pour une compacité maximale, potentiellement nonythoniquement implicite :

width=10
'{: <{}}'.format('sss', width)

Mise à jour 2017-05-26

Avec l'introduction des littéraux de chaîne formatés (" f-strings " en abrégé) dans Python 3.6, il est désormais possible d'accéder à des variables précédemment définies avec une syntaxe plus brève :

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'

Cela s'applique également au formatage des chaînes de caractères

>>> width=10
>>> string = 'sss'
>>> f'{string: <{width}}'
'sss       '

13voto

Ryan Tuck Points 1779

format est certainement la méthode la plus élégante, mais à ce jour, vous ne pouvez pas l'utiliser avec la fonction logging Voici donc comment vous pouvez le faire en utilisant le module % le formatage :

formatter = logging.Formatter(
    fmt='%(asctime)s | %(name)-20s | %(levelname)-10s | %(message)s',
)

Ici, le - indique l'alignement à gauche, et le nombre avant s indique la largeur fixe.

Quelques exemples de résultats :

2017-03-14 14:43:42,581 | this-app             | INFO       | running main
2017-03-14 14:43:42,581 | this-app.aux         | DEBUG      | 5 is an int!
2017-03-14 14:43:42,581 | this-app.aux         | INFO       | hello
2017-03-14 14:43:42,581 | this-app             | ERROR      | failed running main

Plus d'informations dans la documentation ici : https://docs.python.org/2/library/stdtypes.html#string-formatting-operations

8voto

Miladiouss Points 642
>>> print(f"{'123':<4}56789")
123 56789

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X