次のリストを考えます
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で停止するように指示する必要があります。
for
ループでは、リストa
の要素を繰り返し処理しています。しかし、ループの本体では、実際にインデックスが必要なときに、それらのアイテムを使用してそのリストのインデックスを作成しています。a
に5つのアイテムが含まれ、それらの中に100が含まれ、forループがそれに到達すると想像してください。基本的にリストa
の100番目の要素を取得しようとしますが、これは明らかにそこにはありません。これにより、IndexError
が得られます。代わりに、さまざまなインデックスを反復処理することでこの問題を修正できます。
_for i in range(len(a))
_
そしてa
のそのようなアイテムにアクセスします:_a[i]
_。これによりエラーは発生しません。
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
_を使用しているため、最後の要素を取得できますが、この方法でエラーを回避できます。
b = [a[i] + a[i+1] for i in range(len(a) - 1)]
これにより、1行だけでジョブが実行されます。
_for i in a:
_を呼び出すと、インデックスではなく実際の要素が取得されます。最後の要素、つまり_3
_に到達すると、b.append(a[i+1]-a[i])
は_a[4]
_を探しますが、見つからないため失敗します。代わりに、最後のインデックスの少し手前で停止しながら、インデックスを反復処理してみてください。
for i in range(0, len(a)-1): Do something
あなたの現在のコードはまだ何かを行う部分ではまだ動作しません;)
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)
リスト要素にアクセスし、それらを使用してリストのインデックスを作成しようとしています。これは良い考えではありません。インデックスを使用して合計リストを取得する方法を示す答えは既にありますが、別のオプションは Zip
ペアを合計できるようにそれ自体のスライスを持つリストにすることです。
b = [i + j for i, j in Zip(a, a[1:])]