生成器代码中的 ListComp 太复杂

ListComp inside generator code too complex

这是一段非常神秘的代码,我读过但无法理解。我就post这里,求高手帮忙。如果给定一些会议日程,即将决定最少需要多少个会议室。

例如,如果会议安排是 - [[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 标记新事件,并将此值添加到计数器中。类似地,[j,-1] 中的 -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)