次のコードを実行すると、エラーが発生します。 for i in len(str_list): TypeError: 'int' オブジェクトはイテラブルではありません。
どのように修正すればいいのでしょうか?(Python 3)
def str_avg(str):
str_list=str.split()
str_sum=0
for i in len(str_list):
str_sum += len(str_list[i])
return str_sum/i
整数をループさせようとしている。len()
は1を返す。
もし、整数の列に対するループを生成しなければならない場合は、 range()
オブジェクト を使ってください。
for i in range(len(str_list)):
# ...
range()に
len(str_list)の結果を渡すと、0から
str_list` の長さを1だけ減らしたものが得られます(終了値が含まれないからです)。
ここで、i
の値は実際のリストの長さより 1 だけ小さい ので、平均を計算するのに使うには 不正確な 値であることに注意してください!なぜなら、実際のリストの長さよりも **1 だけ小さいからです! len(str_list)
で割りたいのです。
return str_sum / len(str_list)
しかし、Pythonではこれを行う必要は**ありません。リストそのものをループさせるのです。これによって、最初にインデックスを作成する必要性がなくなります。
for elem in str_list
str_sum += len(elem)
return str_sum / len(str_list)
ちなみに、これらはすべてsum()
関数で1行で表現することができます。
def str_avg(s):
str_list = s.split()
return sum(len(w) for w in str_list) / len(str_list)
組み込みの型名を隠してしまうと、後で混乱することになるので、 str
という名前は s
に置き換えています。
Forループでは、[1, 2, 3]のリスト(3つの項目/要素を含む)のように、複数の項目を反復処理する必要があります。
len関数は、パラメータとして与えたオブジェクトの長さの整数を1つの項目として返します。
オブジェクトの長さの数だけ反復処理を行うには、len関数の結果を範囲関数に渡します。これは反復可能なオブジェクトを作成し、オブジェクトの長さの何倍でも反復することができます。
つまり、次のようなことです。
for i in range(len(str_list)):
は、リストの長さではなく、リストを通過させたい場合を除きます。その場合は
for i in str_list: