ListComp 里面的生成器代码太复杂

问题描述

这是一段非常神秘的代码,我读过但无法理解。我会在这里发帖并寻求专家的帮助。如果给定一些会议日程,即将决定最少需要多少间会议室。

例如,如果会议日程是 - [[1,10],[5,12],[10,15]] 那么它至少需要 2 个房间。

代码如下:

def mini_room(intervals):

    room,current = 0,0
    for i,v in sorted(x for i,j in intervals for x in [[i,1],[j,-1]]):
        current += v
        room = max(room,current)

print(mini_room(meetings)) # 

解决方法

方法很简单。您需要一个计数器,它在事件开始时递增,在事件结束时递减。该计数器的最大值将为您提供所需的房间数。

“令人困惑”的语句 for i,v in sorted(x for i,j in intervals for x in [[i,1],[j,-1]]) 本质上是这样做的:

  1. 对于每个区间i,j,它把它分解成[i,1][j,-1]
  2. 创建所述间隔的列表
  3. 对它们进行排序并遍历它

1 被添加到 i (在 [i,1] 中)因为就像我上面解释的那样,当事件开始时计数器需要增加。 1 标记新事件,并将此值添加到计数器中。同样,-1 中的 [j,-1] 标记事件结束并从计数器中减去。

编辑:
这是一个简化版本。

simple = []
for i in intervals:
    simple.append([i[0],1])
    simple.append([i[1],-1])
simple.sort()
counter = 0
ans = 0
for i in simple:
    counter += i[1]
    ans = max(ans,counter)
print(ans)