私はPythonにまったく慣れていません。多次元配列について助けが必要です。劇場の座席予約システムを作っています。(ただ練習してください)。5列×10シートのマトリックスを設定しました。そして、私が本当にできる必要があるのは、各座席に「利用可能」または「利用不可」を割り当てることだけです。私はこれを明らかに行うことができますが、どのようにすればよいかわからないのは、列を検索またはループして、6つの座席が隣り合っているかどうかを確認することです。どんな助けでも素晴らしいでしょう。私はPythonにまったく慣れていないことを覚えておいてください。
3 に答える
私が考えることができる最も簡単な方法は、行番号をとして追跡しながら、行を反復処理することindex
です。
次に、6つ続けて見つかるまで、または空いているシートに遭遇するまで、空いているシートをカウントします(これが発生した場合はカウントをリセットします)。
seats = [[True, True, True, False, True, True, True, False, False, True],
[True, True, True, True, True, True, True, False, False, True],
[True, True, True, False, True, True, True, False, False, True],
[True, True, True, False, True, True, True, False, False, True],
[True, True, True, True, True, True, True, False, False, True]]
for index, row in enumerate(seats):
consecutive_seats = 0
for seat in row:
if seat:
consecutive_seats += 1
if consecutive_seats >= 6:
print('There are at least six seats available on row', index)
break
else:
consecutive_seats = 0
詳細説明
Python
enumerate
関数を使用すると、のシーケンスを反復処理してseats
、インデックスとそのインデックスの現在のアイテムを返すことができます。オプションで、パラメータを渡して開始インデックスを設定できます(したがって、シート行を1から開始する場合は、代わりに次を使用できます。for index, row in enumerate(seats, start=1): ...
実際、ここで起こっていることの詳細は興味深いものです。解凍する
enumerate
2つのアイテムTuple
(不変-不変-リストと考えてください)を返します。その後、これら2つの変数を他の変数と同じように使用できます。index
row
インデックスと行のペアごとに、行を繰り返し処理して、そうであるかどうかを確認し
seat
ますTrue
(書き込むことはできますが、書き込むべきではありませんseat == True
。冗長な情報です)。の場合はTrue
、空いているとみなし、空いている連続席のカウンターを1つ増やします。その後すぐに、十分な空きシートが見つかったかどうかを確認する必要があります。この場合
break
、ループから抜けることができます。つまり、列の残りのシートはすでに十分にわかっているため、スキップしています。無料で、外側のループの次の反復を続行します。これにより、次の行のインデックスと行が生成されます。一方、座席が
False
(利用できない)場合は、連続する利用可能な座席の数をゼロにリセットしますが、残りの行をチェックし続けます。
提案された改善
- クラス
Seat
を作成し、それに属性を与えますis_available
- 魔法数を取り除くために定数を導入する
以下のような座席配置があると仮定します
seats=[ [1, 0, 0, 0, 1, 1, 1, 0, 1, 0],
[0, 0, 0, 1, 1, 0, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 0, 1, 0, 0, 1],
[0, 0, 1, 0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0]]
ネストされたリストとして維持する代わりに、文字列のリストを維持することをお勧めします。パターン(ここでは「0」または「1」のシーケンス、あるいはミドルシートやエンドシートのような複雑なもの)の検索は、文字列検索によってより速く簡単になります。複雑な検索の場合でも、正規表現を使用できます
推奨されるデータ構造
seats=[ '1000111010',
'0001101110',
'0011101001',
'0010000011',
'0000000100']
連続する6つの空席を検索するには、'0'*6
次のようなものを検索する必要があります。
>>> any('0'*6 in row for row in seats)
True
>>> next((i,row.index('0'*6)) for i,row in enumerate(seats) if '0'*6 in row )
(4, 0)
説明
next((i,row.index('0'*6)) for i,row in enumerate(seats) if '0'*6 in row )
ジェネレータ式から最初の項目を返します。ビルトインについて知っていると仮定します
enumerate:(index、element)のタプルのリストを返します
式は、同等に次のように書くことができます。
for i,row in enumerate(seats):
if '0'*6 in row
print (i,row.index('0'*6)
break
any('0'*6 in row for row in seats)
同等に書くことができます
def search(seats):
for row in seats:
if '0'*6 in row:
return True
return False
スパース行列の使用を検討できます。
そしてそれをそのように繰り返します: https ://stackoverflow.com/a/4319159/1031417