Составьте диапазоны в 2D-списке

#python #list #range #2d

Вопрос:

Учитывая отсортированный список целых чисел в Python, который не содержит дубликатов, я хочу составить 2D-список, содержащий диапазоны (с шагом 1) на основе этого списка. Так , например: x = [-1, 0, 1, 2, 6, 7, 9] , я хочу, чтобы результат был: [[-1, 0, 1, 2], [6, 7], [9]] или y = [4, 5, 7, 12, 15, 16] должен привести к [[4,5], [7], [12], [15,16]]

Ответ №1:

попробуйте использовать numpy :

 from numpy import diff, where, split
result= split(x, where(diff(x)>1)[0] 1 )
print(list(map(list, result)))
 

 [[-1, 0, 1, 2], [6, 7], [9]]
 

ИЛИ вы можете использовать more_itertools :

 import more_itertools as mit
print([list(group) for group in mit.consecutive_groups(x)])
 

или

 from itertools import groupby
from operator import itemgetter

print([list(map(itemgetter(1), group)) for key, group in groupby(enumerate(x), lambda i: i[0] - i[1])])  
 

Ответ №2:

Решение с использованием только собственного python:

 def foo(x):
    head, *tail = x
    result = [[head]]
    for j in tail:
        if j == result[-1][-1] 1:
            result[-1].append(j)
        else:
            result.append([j])
    return result