2024-10-01 13:26:19 发布
网友
我对python完全陌生。我需要一些多维数组的帮助。我正在为一家剧院订座。(只是练习一下)。我建立了一个5排10座的矩阵。我真正需要做的就是给每个座位分配“空闲”或“不可用”。很明显,我可以做到这一点,但我不知道该怎么做,就是能够搜索或循环一排,看看是否有6个座位相邻。任何帮助都会很好。请记住,我对python完全陌生。在
假设您的座位安排与下面类似
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”的序列,甚至是一些复杂的东西,如中间座位或尾端座位)更快更容易搜索。即使对于复杂的搜索,也可以使用regex
建议的数据结构
现在要搜索连续6个空座位,您必须搜索'0'*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 )返回生成器表达式中的第一项。假设你知道
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)可以等价地写成
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
您可以考虑使用sparse matrix。在
然后像这样重复: https://stackoverflow.com/a/4319159/1031417
我能想到的最简单的方法是迭代行,将行号跟踪为index。在
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
python ^{}函数允许您迭代seats的序列,返回一个索引和该索引处的当前项。或者,您可以向它传递一个参数来设置起始索引(因此,如果您希望座椅行从一个开始,可以使用以下选项:
seats
事实上,这里发生的事情的细节很有趣:enumerate返回一个两项^{}(可以将它看作是一个不可变的–不可更改的列表),您正在将其解压缩到index和row。然后可以像使用其他变量一样使用这两个变量。
enumerate
row
对于每对索引和行,遍历该行并检查seat是否是True(您可以,但不应该写seat == True——这是冗余信息)。如果是True,则认为它可用,并将可用连续座位的计数器增加一个。
seat
True
seat == True
紧接着,您需要检查是否找到了足够的空闲座位,在这种情况下,您可以^{}退出循环,换句话说,您将跳过该行中的其余座位,因为您已经知道有足够多的座位是空闲的,并继续外循环的下一次迭代,这将生成下一行索引和行。
另一方面,如果座位是False(不可用),则将连续可用座位的计数重置为零,但继续检查行的其余部分。
False
Seat
is_available
假设您的座位安排与下面类似
我的建议是维护一个字符串列表,而不是作为嵌套列表进行维护。通过字符串搜索,搜索一个模式(这里是“0”或“1”的序列,甚至是一些复杂的东西,如中间座位或尾端座位)更快更容易搜索。即使对于复杂的搜索,也可以使用regex
建议的数据结构
^{pr2}$现在要搜索连续6个空座位,您必须搜索
'0'*6
类似于解释
next((i,row.index('0'*6)) for i,row in enumerate(seats) if '0'*6 in row )
返回生成器表达式中的第一项。假设你知道enumerate:返回(index,element)元组的列表
表达式可以等价地写成
any('0'*6 in row for row in seats)
可以等价地写成您可以考虑使用sparse matrix。在
然后像这样重复: https://stackoverflow.com/a/4319159/1031417
我能想到的最简单的方法是迭代行,将行号跟踪为
index
。在然后,我们计算可用的座位数,直到我们连续找到六个座位,或者直到我们遇到一个不可用的座位(如果发生这种情况,我们重置计数)。在
进一步说明
python ^{} 函数允许您迭代
^{pr2}$seats
的序列,返回一个索引和该索引处的当前项。或者,您可以向它传递一个参数来设置起始索引(因此,如果您希望座椅行从一个开始,可以使用以下选项:事实上,这里发生的事情的细节很有趣:} (可以将它看作是一个不可变的–不可更改的列表),您正在将其解压缩到
enumerate
返回一个两项^{index
和row
。然后可以像使用其他变量一样使用这两个变量。对于每对索引和行,遍历该行并检查
seat
是否是True
(您可以,但不应该写seat == True
——这是冗余信息)。如果是True
,则认为它可用,并将可用连续座位的计数器增加一个。紧接着,您需要检查是否找到了足够的空闲座位,在这种情况下,您可以^{} 退出循环,换句话说,您将跳过该行中的其余座位,因为您已经知道有足够多的座位是空闲的,并继续外循环的下一次迭代,这将生成下一行索引和行。
另一方面,如果座位是
False
(不可用),则将连续可用座位的计数重置为零,但继续检查行的其余部分。改进建议
Seat
,并给它一个属性is_available
相关问题 更多 >
编程相关推荐