これはやや文字化けしたコードの抜粋です。
コンテキストは、[100、92、87 など] のように見えるリスト、建物を反復しようとしているということです。建物の各フロアを繰り返し処理し、その人を (現在のフロアを減らすことによって) 次の使用可能な階段に移動します。
私の問題は、関数内のリストと if ステートメントのネストです。これは三重苦で、適切な構文を理解するのに苦労しています:
リストのリストの特定の部分を呼び出す - すなわち list[i][j]
ループ内で if ステートメントを使用する
ネストループ
他のループでループ変数を使用する
これが私のコードです:
def Evacuate(building):
while sum(building) > 0:
for i in building:
if building[i] > 0:
for j in range(STAIRCASE):
if staircasenetwork[j[i-1]] < CAPACITY:
building[i] -= 1
staircase[i-1] += [TRAVELTIME]
編集:
私は問題を理解しました。建物の入力はリストです。Staircasenetwork もリストです。リストは次のようになります
building = [100,90,101]
staircasenetwork = [[0,0,0],[0,0,0]]
これは、人でいっぱいの 3 階建ての建物と 2 つの空の階段を表しています。
私が間違っていたのは、次の行に沿って何かを書こうとしていたことです。
for i in building:
#I'm skipping or simplifying some specific conditionals for the problem here
for j in staircasenetwork:
building[i] -= 1
staircasenetwork[j][i] += 1
(i) 建物 ([0, 1, 2] と予想) と (j) 階段ネットワーク ([0, 1] と予想) を取り、これら 2 つの座標を使用して私が書いたリストを繰り返します。
私が忘れていたのは、Python がそれらの値を (i) に直接代入してリストを反復処理することです。
したがって、リストがある場合:
[100, 90, 101]
そして私は書く:
for i in list:
print i
それは印刷されます:
100
90
101
いいえ:
0
1
2
したがって、私の問題の修正は、ビルドの代わりに range(len(building) を使用することでした。
このステートメントは構築を受け取り、最初に len() を使用してリスト構築の長さに等しい整数に変換します。次に、range() を使用して、その整数を 0 から X までの数値のリストに変換します。
基本的に: [100, 90, 101] >> 3 >> [0, 1, 2]
building = [100, 90, 101]
for i in range(len(building)):
print str(range(len(building))) + " " str(building)
印刷します:
0 100
1 90
2 101
だから私の最初の試みで、私が使用するとき:
for i in building:
#to call on
building[i]
最初に行うことは、建物リストの最初の値である 100 を調べることです。次に、その番号を使用して、建物リストの 100 番目の番号を見つけますが、そのリストは 3 つの値しかないため存在しません。
それはこれをしようとします:
building = [100, 90, 101]
for i in building
>>> first val of building = 100
building[100]
>>> IndexError: list index out of range
>>> Is looking for the 100th number in a 3-number long list
次のようなステートメントを使用する方法があります。
for i, e in enumerate(building):
次のようなタプルのリストを作成するには:
[(0, 100), (1, 90), (2, 101)]
しかし、私は range(len(building)) メソッドを使用することを好みました。この方法は速度の優れた基準には達しないかもしれませんが、コードの仕組みについて何かを教えてくれ、小さな問題を解決してくれます。
固定コードは次のようになります。
for i in range(len(building)):
for j in range(len(staircasenetwork)):
building[i] -= 1
staircasenetwork[j][i] += 1
(i) と (j) は、変数を直接反映するのではなく、(range(len()) を介して) の座標になります。
レゴ ストームトルーパーは、私のコードの他の問題に対しても素晴らしい回答を書いています。