1. ホーム
  2. python

[解決済み] Pythonのループ。リストのインデックスが範囲外

2022-03-02 22:28:51

質問

次のようなリストがあるとする。

a = [0, 1, 2, 3]

新しいリストを作成したい b の現在値と次の値が一致する要素で構成されます。 a は合計されます。これには 1 よりも少ない要素 a .

こんな感じで。

b = [1, 3, 5]

(0+1,1+2,2+3から)

以下は、私が試したものです。

b = []
for i in a:
   b.append(a[i + 1] - a[i])
b

困ったことに、このエラーが出続けているのです。

IndexError: list index out of range

これは、aの最後の要素(3)を取得するまでに、その値を何かに足すことができないためだと思います(足すべき3の後の値がない)。そこで、計算のために3を参照しながら、2で停止するようにコードを指示する必要があります。

どのように解決するのですか?

  1. あなたの for ループの中で、リストの要素を反復しています。 a . しかし、ループの本体では、実際にインデックスが必要なときに、これらの項目を使用してリストのインデックスを作成しています。
    もし、リスト a は5つの項目を含み、その中に100という数字があり、forループはそれに到達します。基本的には、リストの100番目の要素を取得しようとします。 a これは明らかに存在しない。この場合 IndexError .

この問題は、代わりにインデックスの範囲に対して反復処理を行うことで解決できます。

for i in range(len(a))

にアクセスし a の項目はこんな感じです。 a[i] . これでエラーになることはありません。

  1. ループの本体で、インデックスを作成しているのは a[i] のみならず a[i+1] . ここもエラーの可能性があるところです。もしリストが5つの項目を含んでいて、ポイント1で示したようにそれを繰り返し処理する場合 IndexError . なぜか?なぜなら range(5) は本来 0 1 2 3 4 を取得しようとするので、ループが4になったときに a[5] という項目があります。Pythonのインデックスは0から始まり、リストには5つの項目があるので、最後の項目はインデックス4となり、そのため a[5] は、存在しない6番目の要素を取得することを意味します。

この問題を解決するには、以下のように len(a) を取得するために、範囲シーケンス 0 1 2 3 . インデックスを使用しているので i+1 のように、最後の要素を取得することになりますが、この方法でエラーを回避することができます。

  1. ここでやろうとしていることを実現するには、さまざまな方法があります。中にはリスト内包のような非常にエレガントでよりpythonicなものもあります。

b = [a[i] + a[i+1] for i in range(len(a) - 1)]

これは、たった一行で仕事をこなしてくれます。