2016-11-08 8 views
0

私は自分のコードに何が問題なのかを解明しようとしています。あなたが番号1111を与えれば、それは出力41あなたは整数を読み込みます、読み取りそれ-と、水抜きに慣れていない人のためにそうPythonの「読み込み中」プログラムで非常に奇妙で挑戦的なエラー

def next(I): 

if I == 0: 
    return 0 
else: 
    s_I = str(I) 
    result_s = '' 
    result_i = 0 
    while True: 

     if len(s_I) !=0: 
      count = 1 
      marker = s_I[0] 
      for x in range(0, (len(s_I)-1)): 
       if s_I[x] == s_I[x+1] and s_I[x] == marker: 
        count = count + 1 
      result_s = result_s + str(count) + marker 

      s_I = s_I[count:] 
      continue 
     else: 
      break 

    result_i = int(result_s) 
    print(result_i) 

:これは私がこれまでに起こったものですシーケンスの次の整数は、それを再度読み取った後のものです。たとえば、最初のカップルは、1,11,21,1211,111221,312211,13112221などです。これは私の問題です:

私は私が次のものではない番号の繰り返しを持つたびにそれには1211や11122211のように、動作しません。 1は何らかの理由で再びカウントされ、すべてが奇妙になります。で

  • :例えば

    I = 1211

  • :次の(I)
  • アウト:それは111221.なければならない場合2121

すべてのヘルプは大きくなるであろう感謝!!!

ありがとうございます!

答えて

0

あなたのforループロジックが間違っています。まず、範囲はnまでは上がりますが、nは含まれません。あなたはループする必要がありますfor x in range(1,len(S_I)):

1はすでにカウントを開始しているためです。したがって、0から開始すると最初の要素が2回カウントされます。これは、このエラーの原因となるはずです。すべての数値を二重にカウントしています。

+0

ああ、公正なポイント。私が-1までの範囲を持っていたのは、その下のif文で発生したインデックスエラーによるものです。私はあなたが示唆したものに変更しました、それはより意味があるようになりましたが、現在、私は適切なifステートメントに苦しんでいます。 – Alex

+0

次の文字の代わりに最後の文字を確認することができます。 –

+0

"最も簡単な方法はしばしば最も簡単です。"ありがとうございました。私の出力は依然として希望の出力と一致していません。私が上に持っているinとoutのステートメントは、まだ彼らの方法です。残念なことに、二重カウントがまだ発生しています。私はそれに取り組み、私が何を召集できるかを見ていきます。あなたが他のアイデアを持っているなら、私に知らせてください。しかし、あなたはすでに大きな助けになっています。ありがとう – Alex

0

もちろんitertools.groupby()を使用してはるかに簡単にこれを行うことができます。今ちょうど平らにjoin()

>>> import itertools as it 
>>> n = 1211 
>>> [(str(len(list(i))), c) for c, i in it.groupby(str(n))] 
[('1', '1'), ('1', '2'), ('2', '1')] 

>>> ''.join(it.chain.from_iterable((str(len(list(i))), c) for c, i in it.groupby(str(n)))) 
'111221' 
+0

ちょっとAChampion、返信いただきありがとうございます。残念ながら、私は基本的な少数以外のライブラリをインポートしないように言われました。 – Alex

関連する問題