Python|制作带有序列号的区间列表
给定一个序列号列表,编写一个Python程序将给定的列表转换为区间列表。
例子:
Input : [2, 3, 4, 5, 7, 8, 9, 11, 15, 16]
Output : [[2, 5], [7, 11], [15, 16]]
Input : [1, 2, 3, 6, 7, 8, 9, 10]
Output : [[1, 3], [6, 10]]
方法#1:朴素的方法
首先,我们使用蛮力方法将序列号列表转换为间隔。开始循环直到列表的长度。在每次迭代中,使用另一个循环来检查序列的连续性。一旦序列停止,产生每个区间的下限和上限。
# Python3 program to Convert list of
# sequential number into intervals
def interval_extract(list):
length = len(list)
i = 0
while (i< length):
low = list[i]
while i = 1):
yield [low, high]
elif (high - low == 1):
yield [low, ]
yield [high, ]
else:
yield [low, ]
i += 1
# Driver code
l = [2, 3, 4, 5, 7, 8, 9, 11, 15, 16]
print( list(interval_extract(l)))
输出:
[[2, 5], [7, 9], [11], [15, 16]]
方法#2: Pythonic Naive
首先,对给定的列表进行排序。用第一个元素初始化previous_number和range_start 。开始一个循环并检查下一个数字是否是前一个数字的加法,如果是,则将此数字初始化为前一个数字,否则产生以range_start开始并以previous_number结束的新间隔。
# Python3 program to Convert list of
# sequential number into intervals
def interval_extract(list):
list = sorted(set(list))
range_start = previous_number = list[0]
for number in list[1:]:
if number == previous_number + 1:
previous_number = number
else:
yield [range_start, previous_number]
range_start = previous_number = number
yield [range_start, previous_number]
# Driver code
l = [2, 3, 4, 5, 7, 8, 9, 11, 15, 16]
print( list(interval_extract(l)))
输出:
[[2, 5], [7, 9], [11, 11], [15, 16]]
方法 #3:使用 itertools
另一种 pythonic 方法是使用Python itertools。我们使用itertools.groupby()
。其中 enumerate(iterable) 被视为可迭代,而lambda t: t[1] – t[0])被视为查找间隔序列的关键函数。
# Python3 program to Convert list of
# sequential number into intervals
import itertools
def intervals_extract(iterable):
iterable = sorted(set(iterable))
for key, group in itertools.groupby(enumerate(iterable),
lambda t: t[1] - t[0]):
group = list(group)
yield [group[0][1], group[-1][1]]
# Driver code
l = [2, 3, 4, 5, 7, 8, 9, 11, 15, 16]
print( list(intervals_extract(l)))
输出:
[[2, 5], [7, 9], [11, 11], [15, 16]]