web-dev-qa-db-ja.com

Python Loop:リストインデックスが範囲外です

次のリストを考えます

a = [0, 1, 2, 3]

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

このような:

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

私は(3)の最後の要素を取得するまでに、それを値の範囲外にするため、何にも追加できないため、それが起こると確信しています(3の後に追加する値はありません)。したがって、計算のために3を参照しながら、コードを2で停止するように指示する必要があります。

9
Dance Party2
  1. forループでは、リストaの要素を繰り返し処理しています。しかし、ループの本体では、実際にインデックスが必要なときに、それらのアイテムを使用してそのリストのインデックスを作成しています。
    リストaに5つのアイテムが含まれ、それらの中に100が含まれ、forループがそれに到達すると想像してください。基本的にリストaの100番目の要素を取得しようとしますが、これは明らかにそこにはありません。これにより、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番目の要素を取得することになります。

それを修正するには、範囲シーケンス_0 1 2 3_を取得するためにlen(a)から1を引く必要があります。インデックス_i+1_を使用しているため、最後の要素を取得できますが、この方法でエラーを回避できます。

  1. ここでやろうとしていることを達成するためのさまざまな方法があります。それらのいくつかは、リストの内包表記のように、非常にエレガントでより「Python的な」ものです。

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

これにより、1行だけでジョブが実行されます。

14
illright

_for i in a:_を呼び出すと、インデックスではなく実際の要素が取得されます。最後の要素、つまり_3_に到達すると、b.append(a[i+1]-a[i])は_a[4]_を探しますが、見つからないため失敗します。代わりに、最後のインデックスの少し手前で停止しながら、インデックスを反復処理してみてください。

for i in range(0, len(a)-1): Do something

あなたの現在のコードはまだ何かを行う部分ではまだ動作しません;)

2
Everyone_Else

Forループの範囲をrange(len(a)-1)に減らしてみてください:

a = [0,1,2,3]
b = []

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

print(b)

これは リスト内包表記 として書くこともできます:

b = [a[i] + a[i+1] for i in range(len(a)-1)]
print(b)
2
K. Menyah

リスト要素にアクセスし、それらを使用してリストのインデックスを作成しようとしています。これは良い考えではありません。インデックスを使用して合計リストを取得する方法を示す答えは既にありますが、別のオプションは Zip ペアを合計できるようにそれ自体のスライスを持つリストにすることです。

b = [i + j for i, j in Zip(a, a[1:])]
1
miradulo