2016-10-04 37 views
0

文字列(stringg)を区切り、stringgにすべての大文字の文字列とstringgにすべて小文字の1文字列を作成するプログラムを作成しようとしています。2つの文字列を再帰的に作成する

split_rec('HsaIm') = ('HI', 'sam') 

これは私が再帰的にそれを書くことを試みてきた方法です。

結果は次のようなものでなければなりません。

def split_rec(stringg): 

    if not stringg: 
     return ('') 
    elif stringg[0].isupper() == True and stringg[0].isalpha() == True: 
     return stringg[0] + split_rec(stringg[1:]), split_rec(stringg[1:]) 
    elif stringg[0].isupper() == False and stringg[0].isalpha() == True: 
     return split_rec(stringg[1:]), stringg[0] + split_rec(stringg[1:]) 

私が試してみると、「タプル 'オブジェクトを暗黙的にstrに変換できません」というエラーコードが表示されます。どんな種類の助けにも感謝します。

+0

再帰ロジックが正しくありません。 –

答えて

0

あります再帰ロジックの問題です、それは簡単のように再帰せずに行うことができます。

def split_rec(stringg): 
    alphas = [x for x in stringg if x.isalpha()] 
    lower = [x for x in alphas if not x.isupper() ] 
    upper = [x for x in alphas if x.isupper() ] 
    return (''.join(upper), ''.join(lower)) 
1

まず回避テストので、のような:

if condition == True: 

と書くだけで

if condition: 

次に、タプルを返す必要があり、すべての場合タプルとして結果にアクセスする必要があります。

def split_rec(stringg): 

    if not stringg: 
     return ('','') 
    else: 
     first = stringg[0] 
     assert first.isalpha(), "The string contains invalid characters." 
     upper, lower = split_rec(stringg[1:]) 
     if first.isupper(): 
      return first + upper, lower 
     else: 
      return upper, first + lower 
+0

ありがとうありがとうございました – Goshaaz

1
split_rec = lambda x: tuple(map(''.join, zip(*[(a,'') if a.isupper() else ('',a) for a in x if a.isalpha()]))) 

>>> split_rec('HsaIm') 
('HI', 'sam') 

これはあなたの文字列を取り、右またはタプルの左側にそれを置くことによって、上部または下部ケースとして各文字を並べ替えます。次に、(zip(*[...])を使用して)タプルを解凍し、join関数をそれぞれに適用して文字列に戻し、全体をもう一度タプルにします。

1行の解決策が必要な場合に備えて、

+0

素敵な1ライナーですが、関数内でこれを行う方法を彼に示してもいいと思います。 –

+0

良い点。私は、Goshaazが関数(lambdaではなく)を望むなら、Arun Ghoshの解は本質的に私と同じことをすると思います。唯一の違いは、私が1行にすべてを得るために 'zip'を利用することです。 – bunji

+0

1つの裏地のためだけに1つのライナーが必要であることが分かりません、あなたは多くの読みやすさIMOを緩くします。また、これは再帰関数ではありません。私は、OPが望んでいるものと仮定します。 – Julien

関連する問題