2016-07-02 4 views
1

私は誰かが次のように私を助けることができる期待していた。インデックスの範囲外のエラーが受信されましたが、理由がわかりません。

私はリストに一部のリストでは、次のデータを持っている - >

A = [[['Ghost Block'], ['Ghost Block'], [-7.0, -30000.0, 84935.99999999991, 1.0, 5.0, 0, 84935.99999999991, 1, 1, ['Ghost', 3, 'Ghost', 'Ghost', 'Ghost', 'Ghost', 2, 'Ghost']], [-5.0, -30000.0, 84935.99999999991, 1.0, 4.0, -30000.0, 114935.99999999991, 2, 1, ['Ghost', 3, 'Ghost', 'Ghost', 'Ghost', 'Ghost', 2, 'Ghost']], [-3.0, 33475.49999999997, 84935.99999999991, 1.0, 3.0, -60000.0, 144935.9999999999, 3, 1, ['Ghost', 3, 'Ghost', 'Ghost', 'Ghost', 'Ghost', 2, 'Ghost']], [-1.0, 80158.49999999997, 84935.99999999991, 1.0, 2.0, -26524.50000000003, 111460.49999999994, 4, 1, ['Ghost', 3, 'Ghost', 'Ghost', 'Ghost', 'Ghost', 2, 'Ghost']], [1.0, 31301.99999999997, 84935.99999999991, 1.0, 1.0, 53633.99999999994, 31301.99999999997, 5, 1, ['Ghost', 3, 'Ghost', 'Ghost', 'Ghost', 'Ghost', 2, 'Ghost']]]] 
TempValue = 0 
Ghost_Block = -60000 
for i in range(0,len(A)): 
    for item in range(0,len(A[i])): 
     if A[i][item] == 'Ghost Block': 
      continue 
     else: 
      if A[i][item][9][0] == 'Ghost': # Neighbor 1 
       TempValue += (Ghost_Block*A[i][item][4]) 

を、私は、次のエラーメッセージが表示されます

--> 9    if Value_Spec_Depth[i][item][9][0] == 'Ghost': # Neighbor 1 
IndexError: list index out of range 

私によるとValue_Spec_Depth [i] [item] [9] [0]は範囲外です。なぜ私はこのエラーを受けているのか誰かが私に説明できることを願っています。おかげitem01については

答えて

1

A[i][item]はあなたのifテストに合格したことはありませんので、ない'Ghost Block'(1-値のリストを注意してください)、['Ghost Block']で、elseブロックが代わりに実行されますよう

>>> A[0][0] 
['Ghost Block'] 
>>> A[0][1] 
['Ghost Block'] 

を結果、elseスイートは1つだけのリストのインデックス9にアクセスしようとします。

if A[i][item] == ['Ghost Block']: 

またはリストの最初の要素をテストします:

if A[i][item][0] == 'Ghost Block': 

注意をあなたが直接リストを超えるだけのループをできることをあなたが実際にリストについてテストすることによって、この問題を回避したい

、インデックスを生成する必要はありません。また、あなたはちょうどをテストする場合continueを使用する必要はありません。

for sublist in A: 
    for element in sublist: 
     if element[0] != 'Ghost Block' and element[9][0] == 'Ghost': 
      TempValue += Ghost_Block * element[4] 

別の改善は、リストの代わりにカスタムクラスを使用することです。インデックスを使うことから、それぞれの価値の意味が明確ではありません。

+0

ありがとう、私は私が今しようとしていますので、私はまだ完全には理解していないと思う: TempValue Value_Spec_Depthで私のために= 0 を: 私の項目のための : アイテムの場合==「ゴーストブロック「:[0] [9] プリントアイテム、それが範囲外の私にerrrorリストインデックスを与える: は他 を続けます。私がしているのは基本的に、あなたの3行目の 'と'の後ろのif文の中であなたが言っていることです。 element [9] [0]私のコードでは項目[9] [0]を置いていますが、範囲外のリストインデックスを受け取ります。これを私に説明してください。 – AlmostGr

+0

@AlmostGr: 'item [0] == 'ゴーストブロック'の場合。 'item'はまだリストです。 –

+0

しかし、それはまったく[9]を見ません(あなたは 'ゴースト'のために 'ゴーストブロック'を誤読していませんか?)。インデックス9にはアイテムリスト内にリストがあるので私は、インデックス[9]内の他の要素をどのように反復することができるかを[0]理解できません。 – AlmostGr

関連する問題