2010-10-24 11 views
15

Dovrei definire una funzione pad_with_n_chars(s, n, c) che prende una stringa , un intero 'n' e un carattere 'c' e restituisce una stringa composta da 's' riempita con 'c' per creare una stringa con 'centrato' di lunghezza 'n'. Ad esempio, pad_with_n_chars(”dog”, 5, ”x”) deve restituire la stringa "xdogx".Come eseguire il pad con n caratteri in Python

+0

La soluzione reale al problema è sicuramente importante. Ma altrettanto importante è il rilevamento e la gestione di input errati. Pensa ai tuoi 3 argomenti di input, e vedi se riesci a prevenire i valori di ciascuno di essi potrebbero causare problemi per la tua funzione 'pad_with_n_chars'. – PaulMcG

risposta

37

Con Python2.6 o superiore, non è necessario definire la propria funzione; il metodo di stringa format può fare tutto questo per voi:

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

Bello e conciso! –

+4

Questa è pura magia! –

+0

+1. Si noti che il formato è piuttosto recente e probabilmente non funzionerà con versioni legacy di Python. –

11

Sembra che tu sei solo alla ricerca di puntatori, non una soluzione completa. Così qui è uno:

È possibile moltiplicare le stringhe in Python:

 
>>> "A" * 4 
'AAAA' 

Inoltre vorrei usare i nomi migliori, invece di s userei testo, che è molto più chiara. Anche se il tuo attuale professore (suppongo tu stia imparando Python all'università) usa tali abbreviazioni orribili.

+0

La risposta accettata è elegante e concisa, ma Penso che questo sia molto più versatile e facile da ricordare. – orodbhen

1

beh, poiché questa è una domanda sui compiti a casa, probabilmente non capirai cosa succede se usi le "batterie" che sono incluse.

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

In alternativa, quando non si sta più frequentando la scuola.

>>> "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'] 

penso che si dovrebbe essere in grado di individuare un primo indizio qui ...

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ì basta usare ljust o rjust a sinistra-giustificare (pad a destra) e il tasto destro del giustificano (pad a sinistra) con qualsiasi carattere specificato.

Ad esempio ... fare '111' una stringa 5 cifre imbottita con 'x'es

In Python3.6:

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

>>> '111'.rjust(5, 'x') 
xx111 
Problemi correlati