2010-10-24 13 views
15

Debo definir una función que toma una cadena 's', un número entero 'n', y un carácter 'c' y devuelve una cadena que consta de 's' rellenada con 'c' para crear una cadena con una 's' centrada de longitud 'n'. Por ejemplo, pad_with_n_chars(”dog”, 5, ”x”) debe devolver la cadena "xdogx".Cómo rellenar con n caracteres en Python

+0

La solución real al problema es sin duda importante. Pero igualmente importante es la detección y el manejo de entradas erróneas. Piense en sus 3 argumentos de entrada, y vea si puede anular qué valores de cada uno causarían problemas para su función 'pad_with_n_chars'. – PaulMcG

Respuesta

37

Con Python2.6 o superior, no es necesario definir su propia función; el método de cadena format puede hacer todo esto para usted:

In [18]: '{s:{c}^{n}}'.format(s='dog',n=5,c='x') 
Out[18]: 'xdogx' 
+0

¡Agradable y conciso! –

+4

¡Eso es pura magia! –

+0

+1. Tenga en cuenta que el formato es bastante reciente y probablemente no funcionará con las versiones heredadas de Python. –

11

Parece que está buscando solamente punteros, no es una solución completa. Así que aquí está uno:

Puede multiplicar las cadenas en Python:

 
>>> "A" * 4 
'AAAA' 

Además me gustaría utilizar mejores nombres, en lugar de s que haría uso de texto, que es mucho más clara. Incluso si tu profesor actual (supongo que estás aprendiendo Python en la universidad) usa esas horribles abreviaturas.

+0

La respuesta aceptada es elegante y concisa, pero Creo que este es mucho más versátil y fácil de recordar. – orodbhen

1

bueno, ya que esta es una pregunta para hacer en casa, probablemente no entiendas lo que está pasando si usas las "baterías" que están incluidas.

def pad_with_n_chars(s, n, c): 
    r=n - len(s) 
    if r%2==0: 
     pad=r/2*c 
     return pad + s + pad 
    else: 
     print "what to do if odd ? " 
     #return 1 
print pad_with_n_chars("doggy",9,"y") 

Alternativamente, cuando ya no esté estudiando.

>>> "dog".center(5,"x") 
'xdogx' 
-7
>>> dir(string) 

['Formatter', 
'Template', 
'_TemplateMetaclass', 
'__builtins__', 
'__doc__', 
'__file__', 
'__name__', 
'__package__', 
'_float', 
'_idmap', 
'_idmapL', 
'_int', 
'_long', 
'_multimap', 
'_re', 
'ascii_letters', 
'ascii_lowercase', 
'ascii_uppercase', 
'atof', 
'atof_error', 
'atoi', 
'atoi_error', 
'atol', 
'atol_error', 
'capitalize', 
'capwords', 
'center', 
'count', 
'digits', 
'expandtabs', 
'find', 
'hexdigits', 
'index', 
'index_error', 
'join', 
'joinfields', 
'letters', 
'ljust', 
'lower', 
'lowercase', 
'lstrip', 
'maketrans', 
'octdigits', 
'printable', 
'punctuation', 
'replace', 
'rfind', 
'rindex', 
'rjust', 
'rsplit', 
'rstrip', 
'split', 
'splitfields', 
'strip', 
'swapcase', 
'translate', 
'upper', 
'uppercase', 
'whitespace', 
'zfill'] 

creo que debe ser capaz de detectar una primera pista aquí ...

2
print '=' * 60 
header = lambda x: '%s%s%s' % ('=' * (abs(int(len(x)) - 60)/2),x,'=' * (abs(int(len(x)) - 60)/2)) 
print header("Bayors") 
0

sí sólo tiene que utilizar ljust o rjust a la izquierda justificar (pad derecho) y justificar a la derecha (pad a la izquierda) con cualquier personaje dado.

Por ejemplo ... para hacer '111' una cadena de 5 dígitos rellena con 'x'es

En Python3.6:

>>> '111'.ljust(5, 'x') 
111xx 

>>> '111'.rjust(5, 'x') 
xx111 
Cuestiones relacionadas