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:
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()
.