2015-09-16 22 views
5

C/C++ dünyasından gelen ve bir Python newb'si olarak, bir giriş dizesini (ASCII olması garantili) alan ve son dört karakteri döndüren bu basit dize işlevini yazdım. Dört karakterden azsa, önde gelen konumları ‘A’ harfi ile doldurmak istiyorum. (Bu bir alıştırma değil, başka bir karmaşık işlevin değerli bir parçasıydı)Bu basit dize işlevi nasıl yapılır "pythonic"

Bunu kaba kuvvetlerden basit, zariflere kadar yapmak için düzinelerce yöntem vardır. Aşağıdaki yaklaşımım, işlevsel iken, "Pythonic" görünmüyordu.

Not: Şu anda Python 2.6 kullanıyorum - ve performans bir sorun DEĞİLDİR. Giriş dizeleri kısa (2-8 karakter), ve bu işlevi sadece birkaç bin kez çağırıyorum.

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

çıktısı: Pythoneers dan

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

Öneriler?

cevap

27

haklı göstermek A kullanarak fillchar sonucunu verir. Örnek -

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

Demo -

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

güzel bitti :) – The6thSense

+0

@VigneshKalai - Vay! Bu harika! Tabii ki sorduğuma sevindim! – SMGreenfield

+0

@SMGreenfield Ben anand s kumar olduğunu cevap vermedim :) – The6thSense

4

Dize biçimlendirmesi olan bir şey nasıl yapılır?

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

Sonuç:

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

Burada daha güzel, daha kurallı bir seçenek:

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

Sonuç: Ben sağa sonra str.rjust() basit dilimleme kullanıp ediyorum

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

Kanonik sürümünüz gerçekten harika görünüyor - ama bir Python newb olmak Özellikle kullandığınız sözdizimsel hile (ler) 'i anlamakta zorlanıyorum {: A> 4}. Burada ne yaptığını tarif edebilir misin? – SMGreenfield

+1

@SMGreenfield - bu, "4" karakterlik bir maksimum uzunluğa sahip bir alanda {} 'dilimlenen dizgiyi [-4:]' olarak adlandırır ve çok kısa olan tüm dizeleri doldurur A karakteri. – TigerhawkT3

3

Yapabilirsin aşağıdaki gibi son 4 karakteri, ardından dize tekrarını (* operatör) ve birleştirme (+ operatör) almak için dilimleme kullanın:

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

Çok açık ve anlaşılır! – SMGreenfield

3

Bu

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 
deneyebilirsiniz 0
5

Sen ardından biten dört karakterini orijinal dize önce dört bekçi 'A' karakterini ekleyerek basit alabilir:

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

kadar basit ki!

+0

Bunu seviyorum - çok akıllı - tamamen kutudan çıkmış düşünce! – SMGreenfield