1

これはやや文字化けしたコードの抜粋です。

コンテキストは、[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()) を介して) の座標になります。

レゴ ストームトルーパーは、私のコードの他の問題に対しても素晴らしい回答を書いています。

4

1 に答える 1