Вот как вы можете создать функцию для группировки их, используя itertools
самостоятельно, другие предложили внешние библиотеки, которые также могут это делать
>>> from itertools import count, groupby
>>> years = [2003, 2006, 2007, 2008]
>>> [list(g) for k, g in groupby(years, key=lambda x, c=count(): x - next(c))]
[[2003], [2006, 2007, 2008]]
Получение первого и последние элементы
>>> [[next(g)] + list(g)[-1:] for k, g in
groupby(years, key=lambda x, c=count(): x-next(c))]
[[2003], [2006, 2008]]
Как это работает:
itertools.count
дает вам итератор, который дает значения 0, 1, 2, 3
Итак, когда у вас есть годы, например. 2003, 2006, 2007, 2008
Ключ lambda
, используемый для группировки лет, принимает один параметр x
, который в данном случае является year
. Мы также инициализируем count()
в пределах lambda
, которое мы вычитаем из каждого year
, давая нам
2003, 2005, 2005, 2005
, поскольку count
продолжает увеличиваться, например.
count = 0, 1, 2, 3, ... # as we go on
, Который позволяет groupby
создавать правильные группы
Последняя часть
[next(g)] + list(g)[-1:]
работает, потому что группы, возвращаемые groupby
, являются итераторами, поэтому next(g)
дает нам первый элемент в группе и list(g)
дает нам остальные элементы, из которых мы берем срез [-1:]
, который дает нам list
только последнего элемента, если он существует, в противном случае просто пустой list