【问题标题】:Array item numbers for consecutive items连续项目的数组项目编号
【发布时间】:2014-04-17 01:48:26
【问题描述】:

我正在尝试创建一个座位预订系统,该系统链接到 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 变量检索列表中项目的数量有什么想法吗?

【问题讨论】:

  • 请花点时间重新阅读您所写的内容,并尽量让那些没有陷入这个问题的人更清楚。我不明白数组与座席编码系统有何关系。
  • @Victor'Chris'Cabral:你的评论让我有点困惑。我觉得这个问题很清楚。
  • 我很抱歉。 ['0', '0', '0', '0', '0', '0', '0', '0', '1', '0', 'B'] 并不意味着对我来说很重要。也许我只需要再读一遍。
  • 我和你在一起,维克多。我可以猜到 0 和 1,B 是行字母标识符吗?还是什么?
  • @Avempace 0 代表空闲座位,1 代表已占用座位,B 是行字母标识符。

标签: python python-3.x


【解决方案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']

【讨论】:

    【解决方案2】:

    动态编程是你的朋友!

    您可以定义一个实用函数,为每个座位提供一个新行,列出给定座位左侧有多少空闲座位:

    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
    

    上述函数应应用于每一行,直到找到匹配项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多