2015-09-16 10 views
5

Pochodzę ze świata C/C++ i jako newb Pythona, napisałem tę prostą funkcję łańcuchową, która pobiera ciąg wejściowy (gwarantowany jako ASCII) i zwraca ostatnie cztery znaki. Jeśli jest mniej niż cztery znaki, chcę wypełnić pozycje wiodące literą "A". (nie było to ćwiczenie, ale cenna część innej złożonej funkcji).Jak wykonać tę prostą funkcję ciągów "pythonic"

Istnieje wiele metod tego, od brutalnej siły, do prostych, po eleganckie. Moje podejście poniżej, choć funkcjonalne, nie wydawało się "Pythoniczne".

UWAGA: Aktualnie używam Pythona 2.6 - a wydajność NIE jest problemem. Ciągi wejściowe są krótkie (2-8 znaków), a tę funkcję nazywam tylko kilka tysięcy razy.

def copyFourTrailingChars(src_str): 

    four_char_array = bytearray("AAAA") 
    xfrPos = 4 

    for x in src_str[::-1]: 
     xfrPos -= 1 
     four_char_array[xfrPos] = x 
     if xfrPos == 0: 
      break 

    return str(four_char_array) 


input_str = "7654321" 
print("The output of {0} is {1}".format(input_str, copyFourTrailingChars(input_str))) 

input_str = "21" 
print("The output of {0} is {1}".format(input_str, copyFourTrailingChars(input_str))) 

Wyjście jest:

The output of 7654321 is 4321 
The output of 21 is AA21 

Propozycje od Pythoneers?

Odpowiedz

27

użyłbym proste krojenie i następnie str.rjust() do prawej uzasadnić wynik przy użyciu A jako fillchar. Przykład -

def copy_four(s): 
    return s[-4:].rjust(4,'A') 

Demo -

>>> copy_four('21') 
'AA21' 
>>> copy_four('1233423') 
'3423' 
+1

pięknie wykonane :) – The6thSense

+0

@VigneshKalai - Wow! To jest niesamowite! Pewnie, że się cieszę, że zapytałem! – SMGreenfield

+0

@SMGreenfield Nie odpowiedziałem, że to anand s kumar :) – The6thSense

4

Co powiesz na coś z formatowaniem napisów?

def copy_four(s): 
    return '{}{}{}{}'.format(*('A'*(4-len(s[-4:])) + s[-4:])) 

Wynik:

>>> copy_four('abcde') 
'bcde' 
>>> copy_four('abc') 
'Aabc' 

Oto ładniejszy, bardziej kanoniczny opcja:

def copy_four(s): 
    return '{:A>4}'.format(s[-4:]) 

Wynik:

>>> copy_four('abcde') 
'bcde' 
>>> copy_four('abc') 
'Aabc' 
+0

Twoja wersja kanoniczna wygląda naprawdę fajnie - ale będąc nowym pythonem Pythona, mam trudności ze zrozumieniem użytej sztuczki syntaktycznej, szczególnie {: A> 4}. Czy możesz opisać, co tu zrobiłeś? – SMGreenfield

+1

@SMGreenfield - wyrównuje do prawej '' 'naciętą strunę' s [-4:] 'w polu' {} 'o maksymalnej długości znaków' 4' i wypełnia wszystkie ciągi, które są zbyt krótkie znak "A". – TigerhawkT3

3

można użyć krojenie dostać ostatnie 4 znaki, a następnie powtarzanie ciągu (* operatora) i konkatenacji (+ operatora), jak poniżej:

def trailing_four(s): 
    s = s[-4:] 
    s = 'A' * (4 - len(s)) + s 
    return s 
+0

Bardzo proste i jasne! – SMGreenfield

3

Możesz spróbować tego

def copy_four_trailing_chars(input_string) 
    list_a = ['A','A','A','A'] 
    str1 = input_string[:-4] 
    if len(str1) < 4: 
    str1 = "%s%s" % (''.join(list_a[:4-len(str1)]), str1) 
    return str1 
5

Można proste dodanie znaku „A” cztery Sentinel przed oryginalnego łańcucha, a następnie podjąć kończące cztery znaki:

def copy_four(s): 
    return ('AAAA'+s)[-4:] 

To dość proste!

+0

KOCHAM to - tak sprytne - całkowicie nieszablonowe myślenie! – SMGreenfield

Powiązane problemy