これはなぜ範囲外になっているのでしょうか。

IndexError:リストインデックス範囲外エラーが発生しました。その理由はわかりません。何かアドバイス?

このコードでは、数字のリストが算術数列であるかどうかを確認しようとしています。この場合、すべての数字に2が加算されます。

def is_arith_progession(num_list):

    delta = num_list[1] - num_list[0]
    for num in num_list:
        if not (num_list[num + 1] - num_list[num] == delta):
        return False
    else:
        return True

print(is_arith_progession([2, 4, 6, 8, 10]))
0
nl ru de
あなたのコードのどこにも 2 の制限を課すことは決してありません。 delta は常にリストの最初の2つの要素間の値の差として定義されていますか?
追加された 著者 rahlf23,
num_list内のnumのは、リストのを繰り返し処理します。その後、 value + 1 を使用してインデックスを作成し直します。 num_list [num + 1] - あまり意味がありません。 [3,2,1] 最初のものはすでに範囲外です(このリストには0から2までのインデックスしかありません)。
追加された 著者 Patrick Artner,

4 答え

この:

for num in num_list:
    if not (num_list[num + 1] - num_list[num] == delta):
        return False

ほぼ確実にあなたがそれがすると思うことをしない。 num_list:のnumにを定義すると、 num はリスト num_listアイテムになります。 num はインデックスではありません。したがって、リストが [2、4、6、8、10] の場合、 num4 の場合は範囲​​外になります(つまりこれは、入力リストの長さが5しかなく、 num + 1 というインデックスにアクセスしようとしたためです(インデックスは0から始まるため、0から始まる)。 5 は範囲外です)

You probably want something like この:

# Start at index 1, or you'll always return false since delta == index1 - index0
for index in range(1, len(num_list)-1):
    if not (num_list[num + 1] - num_list[num] == delta):
        return False

またはもっとpythonic(インデックスがないことに注意してください):

# Again start at index1, zip will handle the edge case of ending nicely so we don't go OB
for num, next_num in zip(num_list[1:], num_list[2:]):
    if not (next_num - num == delta):
        return False
2
追加された
@ PatrickArtnerはい更新されました
追加された 著者 Matt Messersmith,
@ PatrickArtnerああはい、それも;)。一定。
追加された 著者 Matt Messersmith,

forループの2回目の繰り返しで num_list 配列の5番目の要素にアクセスしようとしています。最初の繰り返しで num が4になったため、 num_list [num + 1] を評価しようとするとプログラムがクラッシュします。

num variable holds the actual element in the list. It is not index to element.

インデックスを反復処理するには、範囲内のnumに対して(len(num_list) - 1)を試してください。これで問題は解決します。 (括弧内は-1)

2
追加された
@ PatrickArtnerそのとおりです、答えを編集しました。
追加された 著者 Selçuk Gülcan,
@nateph次に、前回の繰り返しのアクセスループ要素に、追加の変数 previous を追加します。この変数をi番目の反復で設定し、それを(i + 1)番目で使用します。
追加された 著者 Selçuk Gülcan,
意図的にrange(len(num_list) - 1)を使わないようにしています。それについてもう少しきれいになろうとしている:)あなたの応答をありがとう
追加された 著者 nateph,

You are iterating over the values, not the indexes of the array. So, num_list[num] can be out of range. Since you refer to the i+1 element, iterate up to i < n-1

for i, _ in enumerate(num_list[:-1]):
    if num_list[i+1] - num_list[i]...
1
追加された
私は実際にこの答えが大好きです。ありがとうございました
追加された 著者 nateph,

2つのこと

  • num is an element of num_list, not just an index. Getting an index would be for num in range(len(num_list)):, you're effectively calling num_list[num_list[i]];
  • Even if it was an index, for the last index num in array you are calling numlist[num+1], which is out of array bounds as num is already last;

範囲内のINDEXに対して(len(num_list)-1):を実行し、そうでなければ(num_list [INDEX + 1] - num_list [INDEX] == delta):それはそれをするべきです。

1
追加された