我正在尝试创建一个链接到CSV文件的座位预订系统,并根据用户输入(所需座位和行号)检查座位是否可用。
然后将用户指定的行检索为line
。 B会回来:
['0', '0', '0', '0', '0', '0', '0', '0', '1', '0', 'B']
其中0是免费座位,1是座位。这封信标识了这一行。
我使用下面的行来检索阵列中最大数量的连续零,从而获得最大的座位数。
LargeBlock = max(sum(1 for _ in g) for k, g in groupby(line) if k == '0')
我也希望返回座位号码。因此,使用上面的示例,如果用户在行B上请求了三个席位,则输出B1-B3可用。关于如何根据用户输入和LargeBlock变量检索列表中项目数量的任何想法?
答案 0 :(得分:1)
通常,找到最大的免费座位组并不是那么有用。例如,一个两个人可以适应两个座位的间隙,他们可能更喜欢那些在另一个连续六个席位中占有一席之地的人。而且,由于您希望机器满载,您可能希望在开始从较大的自由组区域获取点之前,尽早填充这些难以填充的插槽。
因此,我的解决方案不是让您成为最大的群体,而是为您提供每个座位组合,您可以连续使用。
def getPossibleSeats (line, row, num):
if row != line[-1]:
raise ValueError('Invalid row')
for k, g in groupby(enumerate(line[:-1], 1), lambda x: x[1]):
g = list(g)
if k != '0' or len(g) < num:
continue
for i in range(len(g) - num + 1):
yield ['{}{}'.format(row, s) for s, _ in g[i:i+num]]
对于您的示例行,它看起来像这样:
>>> line = ['0', '0', '0', '0', '0', '0', '0', '0', '1', '0', 'B']
>>> for seats in getPossibleSeats(line, 'B', 4):
print(seats)
['B1', 'B2', 'B3', 'B4']
['B2', 'B3', 'B4', 'B5']
['B3', 'B4', 'B5', 'B6']
['B4', 'B5', 'B6', 'B7']
另一个例子,它可能如下所示:
>>> line = list('11000110000001C')
>>> for seats in getPossibleSeats(line, 'C', 2):
print(seats)
['C3', 'C4']
['C4', 'C5']
['C8', 'C9']
['C9', 'C10']
['C10', 'C11']
['C11', 'C12']
['C12', 'C13']
答案 1 :(得分:0)
动态编程是你的朋友!
您可以定义一个实用程序功能,为每个座位提供一个新行,列出给定坐位左侧的有多少空位:
def free_seats(row):
seats = []
seats.append(1 if row[0] == '0' else 0)
for k in range(1, len(row)):
seats.append(0 if row[k] == '1' else 1 + seats[k-1])
return seats
然后使用自由坐位数查找行代码的第一个可能位置:
def find_n_seats(n, line):
row_code = line[-1]
available_seats = free_seats(line[:-1]) # Remove the line code
try:
last_seat = available_seat.index(n)
return [row_code + str(i+1) for i in range(last_seat + 1 - n, last_seat)]
except ValueError:
print('Not possible to find {0} seats in row {1}'.format(n, row_code))
return None
上述功能应该应用于每一行,直到找到匹配为止。