2017-05-19 2 views
1

私はthis challenge in hackerrankを解決しようとしています。これはすべての小文字を大文字に変換するか、逆も同様です。文字列内のスワップケース

私は、次のコードでそれをしよう:それは関数に渡されると返される文字列が同じであるしかし

def swap_case(s): 
    length = len(s) 
    i=0 
    while length: 
     if s1[i].isupper(): 
      s[i].lower() 
     elif s[i].islower(): 
      s[i].upper() 
     length-=1 
     i+=1 
    return s 

if __name__ == '__main__': 
    s = input() 
    result = swap_case(s) 
    print(result) 

。間違いはどこですか?

+3

文字列は変更できません。 's [i] .upper()'は 's [i]'の大文字の "コピー"を返しますが、 's [i]'自体は変更しません。あなたは完全に新しい文字列オブジェクトを作成する必要があります... – Julien

+0

@Julienが言及したように、あなたは実際に元の文字列を変更していません。別の変数を使ってそれぞれの新しい更新を保持し、代わりにその新しい変数を返すことを考えてください。 –

+0

また、Pythonにはこれまでどおり、 'str.swapcase()'という組み込み関数があります。 –

答えて

2

ビルトインstr.swapcaseはすでにこれを行います。

def swap_case(s): 
    return s.swapcase() 
+1

すぐに働いた。ありがとう。 –

1

@Julienはコメントupperlowerのメソッドはコピーを返し、オブジェクト自体は変更しないでください。 this docsを参照してください。

EDIT @aryamccarthyは、この種のタスクのための既存の機能をPythonで思い起こさせました。swapcase()メソッド。詳細hereを参照してください。これは文字列のコピーも返すことに注意してください。

+0

私はあなたのコメントをupvotedしましたが、残念ながらこれらは何の評判も与えていません。 – gonczor

+0

@Julienは精巧な答えを加えることを検討します。コメントは担当者を増やさなかった。 – Ander2

+0

@Julienあなたの言葉が質問の答えとなっていた場合は、その質問にコメントする代わりに回答を投稿する必要があります。 –

2

コメントやその他の回答で述べたように、文字列は不変です。

は、次の試してみてください。

s = input("Enter input: ") 


def convert(ss): 
    # Convert it into list and then change it 
    newSS = list(ss) 
    for i,c in enumerate(newSS): 
     newSS[i] = c.upper() if c.islower() else c.lower() 
    # Convert list back to string 
    return ''.join(newSS) 

print(s) 
print(convert(s)) 

# Or use string build in method 
print (s.swapcase())