2015-09-16 8 views
5

Provenendo dal mondo C/C++ ed essendo un newb Python, ho scritto questa semplice funzione di stringa che accetta una stringa di input (garantita per essere ASCII) e restituisce gli ultimi quattro caratteri. Se ci sono meno di quattro caratteri, voglio riempire le posizioni iniziali con la lettera "A". (questo non era un esercizio, ma una parte preziosa di un'altra funzione complessa)Come rendere semplice questa funzione di stringa "pythonic"

Ci sono dozzine di metodi per farlo, dalla forza bruta, al semplice, all'elegante. Il mio approccio in basso, sebbene funzionale, non sembrava "Pythonic".

NOTA: attualmente sto usando Python 2.6 e le prestazioni NON sono un problema. Le stringhe di input sono brevi (2-8 caratteri) e chiamo questa funzione solo alcune migliaia di volte.

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

L'output è:

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

Suggerimenti da Pythoneers?

risposta

27

userei semplice affettamento e poi str.rjust() a destra giustificare il risultato utilizzando A come fillchar. Esempio -

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

Demo -

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

splendidamente fatto :) – The6thSense

+0

@VigneshKalai - Wow! È fantastico! Sicuro sono contento di averlo chiesto! – SMGreenfield

+0

@SMGreenfield Non ho risposto che era anand s kumar :) – The6thSense

4

Che ne dici di qualcosa con la formattazione di stringhe?

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

Risultato:

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

Ecco un bello, un'opzione più canonica:

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

Risultato:

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

la tua versione canonica sembra davvero interessante, ma essendo un newb di Python sto facendo fatica a capire i trucchi sintattici che hai usato, in particolare {: A> 4}. Puoi descrivere cosa hai fatto qui? – SMGreenfield

+1

@SMGreenfield - allineamento a destra '>' la stringa a strisce 's [-4:]' in un campo '{}' con una lunghezza massima di caratteri '4', e riempie qualsiasi stringa troppo corta con il carattere 'A'. – TigerhawkT3

3

si potrebbe usare affettare per ottenere gli ultimi 4 caratteri, quindi stringa di ripetizione (* operatore) e concatenazione (+ operatore) come di seguito:

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

Molto semplice e chiaro! – SMGreenfield

3

Puoi provare questo

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

è possibile semplice l'aggiunta di 'A' carattere quattro sentinella davanti alla stringa originale, poi prendere le terminano quattro personaggi:

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

Questo è abbastanza semplice!

+0

I LOVE this - così intelligente - totalmente fuori dagli schemi! – SMGreenfield

Problemi correlati