#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