连续项的数组项目编号

时间:2014-03-12 17:49:30

标签: python python-3.x

我正在尝试创建一个链接到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变量检索列表中项目数量的任何想法?

2 个答案:

答案 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

上述功能应该应用于每一行,直到找到匹配为止。