在两个数字之间创建列表列表 --- Python
Create List of Lists in Between Two Numbers --- Python
假设我有以下列表:
intervals = [[3, 5], [11,25], [39,40], [45, 48]]
从起始编号开始,对于本例为 0,一直到结束编号,对于本例为 50,我的目标是创建一个列表列表,其中每个数字的范围不在当前列表列表中.例如,我要生成的列表如下所示:
nonIntervals = [[0, 3], [5, 11], [25, 39], [40, 45], [48, 50]]
我已经在努力实现这一点,但它在某些测试用例上存在问题:
for index in range(len(intervals)):
nonIntervals.append([start, intervals[index][0]])
start = intervals[index][1]
if not(nonIntervals[index][1] == end):
nonIntervals.append([intervals[index][1], end])
在这个例子中,我 运行 解决了一些问题,它会产生我不需要的间隔。例如,如果我使用以下间隔:
intervals = [[0, 5], [11,25], [39,40], [45, 48]]
我在 运行 循环时得到这个间隔:nonIntervals = [[0, 0], [5, 11], [25, 39], [40, 45], [48, 50]]
有谁知道如何避免包含 [0,0] 列表的非间隔列表?出于某种原因,当我想忽略它并以 [5,11] 开头时,它包括数组的开头。当末尾位于列表末尾时同样适用。
例如:intervals = [[0, 5], [11,25], [39,40], [45, 50]]
当 运行ning 我的程序时 returns, nonIntervals = [[0, 0], [5, 11], [25, 39], [40, 45], [50, 50]]
我希望此列表列表中的最后一个列表是 [40, 45]。如果有人知道如何更正我的循环或我需要实现的正确 if 语句,我将不胜感激。
已经有人通过提供使代码正常工作的答案来评论您的问题。但是您可能对 portion
感兴趣,这是我编写的用于处理间隔的库。它在 PyPI 上,因此您可以照常安装它:pip install portion
.
应用于您的示例:
>>> items = [[3, 5], [11,25], [39,40], [45, 48]]
>>> import portion as P
>>> interval = P.Interval(*[P.closed(x, y) for x, y in items])
>>> interval
[3,5] | [11,25] | [39,40] | [45,48]
现在,为了得到所有不在你的列表中的范围,取补码(使用 ~
或 .complement
)并将其限制在你的范围内就足够了'感兴趣(使用 &
或 .intersection
与所需范围):
>>> lower, upper = 0, 50
>>> ~interval & P.closed(lower, upper)
[0,3) | (5,11) | (25,39) | (40,45) | (48,50]
由于 portion
会自动简化区间(包括空区间),因此 [0,0]
不会有任何问题。
假设我有以下列表:
intervals = [[3, 5], [11,25], [39,40], [45, 48]]
从起始编号开始,对于本例为 0,一直到结束编号,对于本例为 50,我的目标是创建一个列表列表,其中每个数字的范围不在当前列表列表中.例如,我要生成的列表如下所示:
nonIntervals = [[0, 3], [5, 11], [25, 39], [40, 45], [48, 50]]
我已经在努力实现这一点,但它在某些测试用例上存在问题:
for index in range(len(intervals)):
nonIntervals.append([start, intervals[index][0]])
start = intervals[index][1]
if not(nonIntervals[index][1] == end):
nonIntervals.append([intervals[index][1], end])
在这个例子中,我 运行 解决了一些问题,它会产生我不需要的间隔。例如,如果我使用以下间隔:
intervals = [[0, 5], [11,25], [39,40], [45, 48]]
我在 运行 循环时得到这个间隔:nonIntervals = [[0, 0], [5, 11], [25, 39], [40, 45], [48, 50]]
有谁知道如何避免包含 [0,0] 列表的非间隔列表?出于某种原因,当我想忽略它并以 [5,11] 开头时,它包括数组的开头。当末尾位于列表末尾时同样适用。
例如:intervals = [[0, 5], [11,25], [39,40], [45, 50]]
当 运行ning 我的程序时 returns, nonIntervals = [[0, 0], [5, 11], [25, 39], [40, 45], [50, 50]]
我希望此列表列表中的最后一个列表是 [40, 45]。如果有人知道如何更正我的循环或我需要实现的正确 if 语句,我将不胜感激。
已经有人通过提供使代码正常工作的答案来评论您的问题。但是您可能对 portion
感兴趣,这是我编写的用于处理间隔的库。它在 PyPI 上,因此您可以照常安装它:pip install portion
.
应用于您的示例:
>>> items = [[3, 5], [11,25], [39,40], [45, 48]]
>>> import portion as P
>>> interval = P.Interval(*[P.closed(x, y) for x, y in items])
>>> interval
[3,5] | [11,25] | [39,40] | [45,48]
现在,为了得到所有不在你的列表中的范围,取补码(使用 ~
或 .complement
)并将其限制在你的范围内就足够了'感兴趣(使用 &
或 .intersection
与所需范围):
>>> lower, upper = 0, 50
>>> ~interval & P.closed(lower, upper)
[0,3) | (5,11) | (25,39) | (40,45) | (48,50]
由于 portion
会自动简化区间(包括空区间),因此 [0,0]
不会有任何问题。