コメントを付けてみましたので,原因を考えてみましょう.
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:
コード本文
```
に記述してください.質問のテンプレートにもあるはずです.