2017-07-06 6 views
0

与えられた文字列を "aabcc"としましょう。この入力が関数を通して実行された後、aaとccが削除されるので、 "b"に減らす必要があります。指定された文字列が "aaabbccc"の場合、これは "ac"になります。Python 2 - 同じ文字を削除して文字列を減らそうとしています

は、だからここに私のコード

def super_reduced_string(s): 
    for i in range(len(s)-1): 
     if s[i] == s[i+1]: 
      s = s.replace(s[i],'') 
    return s 

私は文字列s各反復s = s.replace(s[i],'')を更新しようとするたびにそれは範囲エラー外の文字列インデックスを投げ続けています。これは、最初にプレースホルダにsを代入したときにも発生します。

エラー

Traceback (most recent call last): 
    File "solution.py", line 12, in <module> 
    result = super_reduced_string(s) 
    File "solution.py", line 7, in super_reduced_string 
    if s[i] == s[i+1]: 
IndexError: string index out of range 

は説明と修正をお願い申し上げます。

乾杯

+0

同時に変更している文字列を反復しています。 'for i in range'はi = 5まで実行されますが、置換えが完了すると文字列は短くなります。 – fredtantini

答えて

1

最初の大きな問題は、s.replace(S [i]は、 '')ということであるSのすべてのインスタンスを置き換えます[i]は文字列の中で '' のいずれかの= s.replaceを.Using (s [i]、 ''、2)またはs = s [:i] + s [i + 2:]となります。また、fredtantiniは文字列を短くした後でもまだ5に行くので、forループを使うのは危険です。文字列を繰り返し処理し、whileループを使用する要素を削除したい場合は、より安全です。

def super_reduced_string(s): 
    i = 0 
    while i < len(s) - 1: 
    if s[i] == s[i+1]: 
     s = s.replace(s[i], '', 2) 
    else: 
     i += 1 
    return s 
+0

こんにちは、ありがとうございました!もしあなたが私の代わりにelse条件で私を増やす理由を理解するのを助けることができますか? – user2498110

+0

文字列中の文字を ''で置き換えると、その文字だけが削除されます。したがって、最初の2つのaを削除すると、長さ3の新しい文字列bccが得られます。ここで、0のインデックスはbなので、if文でiをインクリメントすると文字列内の文字をスキップします。 (この削除は、あなたのforループが範囲外のエラーのインデックスを与えるのと同じ理由です) – jyallop

関連する問題