print examples example python python-2.7 format

examples - python format repeat string



¿Cómo formatear la salida de impresión o la cadena en un ancho fijo? (4)

Tengo este código (imprimiendo la ocurrencia de todas las permutaciones en una cadena)

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));

Quiero imprimir todo el evento de permutación que hay en la cadena varaible.

ya que la permutación no tiene la misma longitud, quiero arreglar el ancho e imprimirlo en un bonito no como este:

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

¿Cómo puedo usar el format para hacerlo?

Encontré estas publicaciones, pero no funcionó bien con cadenas alfanuméricas:

formato fijo de cadena de pitón ancho

Configuración de longitud fija con python


Me parece que usar str.format mucho más elegante:

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

Si desea que la cadena se alinee con el uso correcto > lugar de < :

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

Editar: como se menciona en los comentarios: el 0 indica el índice del argumento de formato.


format es definitivamente la manera más elegante, pero afaik no puede usar eso con el módulo de logging de python, así que aquí puede hacerlo usando el formato % :

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

Aquí, el - indica alineación a la izquierda, y el número anterior a s indica el ancho fijo.

Algunos resultados de muestra:

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

Más información en los documentos aquí: https://docs.python.org/2/library/stdtypes.html#string-formatting-operations


Originalmente publicado como una respuesta de edición a @ 0x90, pero se rechazó por desviarse del intento original de la publicación y se recomendó que se publique como comentario o respuesta, por lo que incluyo aquí la breve reseña.

Además de la respuesta de @ 0x90, la sintaxis puede hacerse más flexible, utilizando una variable para el ancho (según el comentario de @ user2763554):

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

Además, puede hacer que esta expresión sea más breve, solo usando números y confiando en el orden de los argumentos pasados ​​al format :

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

O incluso omita todos los números para una compactación máxima, potencialmente no pythonically implícita:

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

Actualización 2017-05-26

Con la introducción de literales de cadena formateados ("f-strings" para abreviar) en Python 3.6, ahora es posible acceder a variables previamente definidas con una sintaxis más breve:

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

Esto también se aplica al formateo de cadenas

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


EDIT 12.11.2013 - Esta respuesta es muy antigua. Todavía es válido y correcto, pero las personas que lo miren deberían preferir la nueva sintaxis de formato .

Puede usar un formato de cadena como este:

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

Básicamente:

  • el % personaje le informa a python que tendrá que sustituir algo por un token
  • el personaje s informa Python el token será una cadena
  • el 5 (o el número que desee) informa a Python para rellenar la cadena con espacios de hasta 5 caracteres.

En su caso específico, una posible implementación podría verse así:

>>> 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 LATERAL: Me pregunto si conoce la existencia del módulo itertools . Por ejemplo, puede obtener una lista de todas sus combinaciones en una línea con:

>>> [''''.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'']

y puede obtener el número de ocurrencias usando combinations en conjunción con count() .