2015-09-16 8 views
5

C/C++の世界から来て、Python newbであるので、入力文字列(ASCIIであることが保証されている)をとり、最後の4文字を返す単純な文字列関数を書いています。文字数が4文字未満の場合は、「A」という文字で先頭の文字を入力します。 (これは演習ではなく、別の複雑な関数の貴重な部分です)この簡単な文字列関数を "pythonic"にする方法

これを行う方法は数々あります。下の私のアプローチは機能的ではあるが、「Pythonic」のようには見えなかった。

注:私は現在、Python 2.6を使用しています。パフォーマンスは問題ではありません。入力文字列は短く(2〜8文字)、私はこの関数を数千回しか呼び出しません。

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

出力は次のようになります。Pythoneersから

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

提案?

答えて

27

正当化する結果はAとしてfillcharとなります。例 -

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

デモ -

あなたは以下のように文字列の繰り返し( *オペレータ)と連結( +オペレータ)、その後、最後の4つの文字を取得するためにスライスし使用することができ
>>> copy_four('21') 
'AA21' 
>>> copy_four('1233423') 
'3423' 
+1

美しく行われました:) – The6thSense

+0

@VigneshKalai - うわー!すごい!もちろん嬉しいです! – SMGreenfield

+0

@SMGreenfield私はそれがクマであると答えることはできませんでした:) – The6thSense

4

文字列形式のものはどうですか?

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

結果:

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

ここでよりよい、より標準的なオプションです:

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

結果:私は右​​に、その後str.rjust()を簡単なスライシングを使用します

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

あなたの正規バージョンは本当にクールなようですが、Python newbですが、特に{:A> 4}のような構文上のトリックを理解するのは苦労しています。ここで何をしたのか説明できますか? – SMGreenfield

+1

@SMGreenfield - スライスされた文字列 's [-4:]'をフィールド '{}'に最大長さ '4'文字で右揃えし、長さが短すぎる文字列を文字「A」。 – TigerhawkT3

3

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

非常に簡単でクリアです! – SMGreenfield

3

試してみる

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

あなたはその後、終了4つの文字取るセンチネル4元の文字列の前に「」文字、簡単な追加することができます十分に簡単です

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

を!

+0

私はこれを愛しています - とても賢い - 完全にすぐれた考え方です! – SMGreenfield

関連する問題