4

我真的对python完全陌生。我需要一些有关多维数组的帮助。我正在为剧院制作座位预订系统。(只是练习)。我已经建立了一个 5 行乘 10 个座位的矩阵。我真正需要做的就是为每个座位分配“可用”或“不可用”。我显然可以做到这一点,但我不知道该怎么做是能够搜索或循环一排,看看是否有 6 个座位相邻。任何帮助都会很棒。请记住,我对 python 完全陌生。

4

3 回答 3

3

我能想到的最简单的方法是遍历行,将行号跟踪为index.

然后,我们计算可用座位,直到我们连续找到六个或遇到一个不可用的座位(如果发生这种情况,我们会重置计数)。

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

进一步说明

  1. pythonenumerate函数允许您遍历 的序列seats,返回一个索引和该索引处的当前项。或者,您可以向它传递一个参数来设置起始索引(因此,如果您希望您的座位行从一个开始,您可以使用以下命令:

    for index, row in enumerate(seats, start=1): ...
    

    事实上,这里发生的事情的细节很有趣:enumerate返回一个包含两个项目Tuple (将其视为一个不可变的- 不可更改的 - 列表),您将其解包indexrow. 然后,您可以像使用其他任何变量一样使用这两个变量。

  2. 对于每一对索引和行,您遍历该行并检查是否seatTrue(您可以但不应该写seat == True——这是冗余信息)。如果是True,您认为它可用并将可用连续座位的计数器增加一个。

  3. 紧接着,你需要检查你是否找到了足够的空闲座位,在这种情况下你可以break跳出循环,换句话说,你跳过了这一排的其余座位,因为你已经知道了足够多的座位是自由,并继续外循环的下一次迭代,这将产生下一行索引和行。

  4. 另一方面,如果座位是False(不可用),您将连续可用座位的计数重置为零,但您继续检查该行的其余部分。

建议的改进

  • 创建一个类Seat并赋予它一个属性is_available
  • 引入常量以摆脱幻数
于 2013-03-26T18:23:08.723 回答
2

假设您的座位安排类似于以下

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
于 2013-03-26T18:20:28.503 回答
0

您可以考虑使用稀疏矩阵

并像这样迭代它: https ://stackoverflow.com/a/4319159/1031417

于 2013-03-26T18:28:09.513 回答