2010-10-24 9 views
15

Powinienem zdefiniować funkcję pad_with_n_chars(s, n, c), która pobieraciąg 's', liczbę całkowitą 'n' i znak 'c' i zwraca ciąg składający się z 's' wypełniony "c", aby utworzyć ciąg znaków z wyśrodkowanym "s" o długości 'n'. Na przykład: pad_with_n_chars(”dog”, 5, ”x”) powinien zwrócić ciąg "xdogx".Jak wstawić n znaków w Pythonie

+0

Rzeczywiste rozwiązanie problemu jest na pewno ważne. Ale równie ważne jest wykrywanie i obsługa błędnych danych wejściowych. Pomyśl o swoich 3 argumentach wejściowych i zobacz, czy możesz antycypować, jakie wartości każdego z nich mogłyby spowodować problemy dla twojej funkcji 'pad_with_n_chars'. – PaulMcG

Odpowiedz

37

Z Python2.6 lub nowszym, nie ma potrzeby definiowania własnej funkcji; metoda ciąg format może zrobić to wszystko dla Ciebie:

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

Ładne i zwięzłe! –

+4

To czysta magia! –

+0

+1. Należy pamiętać, że format jest dość aktualny i prawdopodobnie nie będzie działać ze starszymi wersjami Pythona. –

11

Wygląda jakbyś tylko szuka wskazówek, a nie kompletnego rozwiązania. Więc tutaj jest jeden:

Można mnożyć ciągi w Pythonie:

 
>>> "A" * 4 
'AAAA' 

Dodatkowo chciałbym użyć lepszych nazw, zamiast s użyję tekst, który jest znacznie jaśniejsze. Nawet jeśli twój obecny profesor (przypuszczam, że uczysz się Python na uniwersytecie.) Używa takich okropnych skrótów.

+0

Przyjęta odpowiedź jest elegancka i zwięzła, ale Myślę, że ten jest dużo bardziej wszechstronny i łatwiejszy do zapamiętania. – orodbhen

1

Cóż, ponieważ jest to zadanie domowe, prawdopodobnie nie zrozumiesz, co się dzieje, jeśli używasz "baterii", które są w zestawie.

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

Alternatywnie, gdy nie uczysz się więcej.

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

Myślę, że powinieneś być w stanie dostrzec pierwszą wskazówkę tutaj ...

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

tak po prostu użyć Ljust lub rjust do lewej uzasadnić (pad prawej) i prawym uzasadnić (pad po lewej) z dowolnym znakiem.

Na przykład ... dla '111' a 5-cyfrowy ciąg dopełniane „x'es

W Python3.6:

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

>>> '111'.rjust(5, 'x') 
xx111 
Powiązane problemy