📜  Python|制作带有序列号的区间列表

📅  最后修改于: 2022-05-13 01:54:39.497000             🧑  作者: Mango

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_numberrange_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]]