Pythonでの文字列のランダム並び替えについて
解決したいこと
Pythonで文字列を並び替えるプログラムを作成していますが、解読できないエラーが発生しました
発生している問題・エラー
半分までは動作しますが、それ以降はこのエラーが発生して動作を停止します
(入力が8文字なら4文字、5文字なら3文字まで)
該当するソースコード
乱数を生成して、それをnに格納する
n番目の文字を表示して消去する
の繰り返しのつもりです
自分で試したこと
これから検証を重ねます
Pythonで文字列を並び替えるプログラムを作成していますが、解読できないエラーが発生しました
半分までは動作しますが、それ以降はこのエラーが発生して動作を停止します
(入力が8文字なら4文字、5文字なら3文字まで)
乱数を生成して、それをnに格納する
n番目の文字を表示して消去する
の繰り返しのつもりです
これから検証を重ねます
コメントを付けてみましたので,原因を考えてみましょう.
import random
a = input('文字列:') # 文字列aを取得
char = [] # 空リストcharを生成
for i in a: # 文字列aから文字iを1つずつ取り出し
char.append(i) # 文字iをリストcharに追加
else: # 上のfor文においてbreakで抜け出さなかった場合,
for j in range(len(char)): # リストcharの長さだけループ
n = random.randint(0, len(char) - j - 1) # 0からlen(char)-j-1までの値の整数乱数nを生成
b = char[n] # 整数乱数を使ってn番目を取り出し
char.pop(n) # リストcharのn番目を削除
エラー文ValueError: empty range for randrange() (0, 0, 0)
の意味は,乱数の範囲randrange()
が空empty
であったことに起因するものです.0から0までの範囲は0でemptyなわけです.
ここで,random.randint()
の第二引数len(char) - j - 1
のうち- j
は不要です.無くせばエラーは生じなくなります.
逆に- j
が必要なケースを書いておきますので,違いを考えてみてください.
import random
a = input('文字列:') # 文字列aを取得
char = [] # 空リストcharを生成
for i in a: # 文字列aから文字iを1つずつ取り出し
char.append(i) # 文字iをリストcharに追加
else: # 上のfor文においてbreakで抜け出さなかった場合,
clength = len(char) # リストcharの長さを取得
for j in range(clength): # リストcharの長さだけループ
n = random.randint(0, clength - j - 1) # 0からclength-j-1までの値の整数乱数nを生成
b = char[n] # 整数乱数を使ってn番目を取り出し
char.pop(n) # リストcharのn番目を削除 # Hint: ここでリストcharの長さが1つ減ります.
char
の長さをchar.pop()
で徐々に減らしていくくループの中でlen(char)
も同時に減っていくのに対し,リストから減った量を表現している- j
ごと扱っているため,random.randint()
の第二引数len(char) - j - 1
では2倍の勢いで範囲を減らしていることになります.
したがって,半分まで処理したところで範囲が0になり,empty range
と言われるわけです.
直上のコードで事前にclength
として長さを固定した場合は減った分を示す- j
が必要になりますし,最初のコードでは減った量は既にlen(char)
に反映されているので- j
を書かないだけで正常に動くようになるということですね.
ちなみにアナグラムを生成するなら次のコードで十分です.
import random
a = input('文字列:')
print(''.join(random.sample(a, len(a))))
タグがPython2.7とついていますが,コードはPython3のものです.Python2.7であればinput()
ではなくraw_input()
ですからね.
また,コードはスクリーンショットではなく,コードブロック
(空行1行あける)
```python:
コード本文
```
に記述してください.質問のテンプレートにもあるはずです.
@Nature_Nature
Questioner
@Nature_Nature
Questioner
randint の引数に -1 を指定してしまったのですね。
ちなみに、random.shuffle() という便利な関数があります。
>>> import random
>>> random.randint(0, -1)
/usr/lib/python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.12) or chardet (3.0.4) doesn't match a supported version!
warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.8/random.py", line 248, in randint
return self.randrange(a, b+1)
File "/usr/lib/python3.8/random.py", line 226, in randrange
raise ValueError("empty range for randrange() (%d, %d, %d)" % (istart, istop, width))
ValueError: empty range for randrange() (0, 0, 0)
@Nature_Nature
Questioner