我真的对python完全不熟悉。我需要一些多维数组的帮助。我正在为剧院制作座位预订系统。 (只是练习)。我已经建立了一个5排乘10座的矩阵。而我真正需要做的就是为每个座位分配“可用”或“不可用”。我显然可以做到这一点,但我不知道怎么做才能搜索或循环一行,看看是否有6个席位可供选择。任何帮助都会很棒。请记住,我对python完全不熟悉。
答案 0 :(得分: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
答案 1 :(得分:2)
我能想到的最简单的方法是迭代行,将行号跟踪为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 enumerate
函数允许您迭代seats
的序列,返回索引和该索引处的当前项。或者,您可以传递一个参数来设置起始索引(因此,如果您希望座位行从一个开始,则可以使用以下代码:
for index, row in enumerate(seats, start=1): ...
事实上,这里发生的事情的细节很有趣:enumerate
返回两项Tuple
(将其视为 immutable - unchangeable - list)您解包到index
和row
。然后,您可以像使用其他变量一样使用这两个变量。
对于每对索引和行,您迭代该行并检查seat
是否为True
(您可以,但不应该写seat == True
- 它是冗余信息)。如果是True
,您认为它可用,并将可用连续席位的计数器增加一个。
此后,您需要检查您是否找到了足够的免费座位,在这种情况下,您可以break
退出循环,换句话说,您正在跳过剩余的座位在行中,因为你已经知道它们是足够的,并继续下一个外部循环的迭代,这将产生下一行索引和行。
另一方面,如果座位为False
(不可用),则将连续可用座位的数量重置为零,但您继续检查该行的其余部分。
Seat
并为其指定属性is_available
答案 2 :(得分:0)
您可以考虑使用sparse matrix。