2016-10-04 15 views
0

My機能は次のようになりカウント入力に反復文字がある場合:間違っ繰り返しで文字の結果を繰り返すこと

'abccba' 

それが返されます。

'A-Bb-Ccc-Ccc-Bb-A' 

の代わり:

'A-Bb-Ccc-Cccc-Bbbbb-Aaaaaa' 

を、私はこの問題を解決することができますか?

+0

"は期待できないと予想される出力"? –

+0

ヒント: 'i'が' s'で複数回出現すると、 's.index(i)'は何を返しますか? – jwodder

答えて

1

str.index()を使用しないでください。が最初に一致するを返します。 cb以降、文字列の早いところに表示されるので、現在の文字の位置にかかわらず、21および0が返されます。

ではなく、あなたの位置カウンタを与えるenumerate() functionを使用します。

for i, letter in enumerate(s, 1): 
    a.append(i * letter) 

二番目の引数は開始値です。これを1に設定すると、後で+ 1になることを避けることができます。 enumerate()の詳細については、What does enumerate mean?を参照してください。

あなたはここにリストの内包表記を使用するのではなくlist.append()呼び出し使用することができます。

def accum(s): 
    a = [i * letter for i, letter in enumerate(s, 1)] 
    x = "-".join(a) 
    return x.title() 

、ピンチで、ワンライナーに変えることができます

def accum(s): 
    a = '-'.join([i * c for i, c in enumerate(s, 1)]).title() 
+0

私は 'enumerate(_、starting_index)'を知らなかった。これを使用するのが、ゼロベースのインデックスをインクリメントするよりも多かれ少なかれPythonicです。それは間違いなくクールなソリューションです。 – orlp

+0

@orlp:インデックスカウンタを追加する組み込みのイテレータを使用することで、なぜ不要な手動カウントが不要になるのでしょうか? –

+0

私の心の中で、2番目は 'c * i'と書いてあるので、' i'はもはやインデックスではありません。この場合、文字数の公式は1 +ゼロベースのインデックスであることは偶然であり、 '(i + 1)'を書くことでこれが本当に公式であることを強調することは悪いことではないと思います。しかし、私はどちらかというと確かに特定ではありません。 P.S .: 'join([i * c for enumerate(s、1)])'は私の目を傷つける。 – orlp

1

これはs.index(a)です文字の最初のインデックスを返します。あなたはそれらのインデックスに要素をペアリングするenumerateを使用することができます。ここでは

はPython的ソリューションです:

def accum(s): 
    return "-".join(c*(i+1) for i, c in enumerate(s)).title() 
0

シンプル:

def accum(s): 
    a = [] 
    for i in range(len(s)): 
     a.append(s[i]*(i+1)) 
    x = "-".join(a) 
    return x.title() 
関連する問題