Есть ли в python функция для отображения значений дат, таких как [2011,2012,2013,204] до 2011-2014. где, как [2003,2006,2007,2008] до 2003, 2006-2008 - PullRequest
1 голос
/ 18 февраля 2020

Я работаю над файлом, в котором есть много дат в последовательном порядке. Есть несколько случаев, когда их нет в последовательном порядке, например 2004, 2007, 2008. Есть ли способ написать python функцию для получения значений.

1 Ответ

1 голос
/ 19 февраля 2020

Вот как вы можете создать функцию для группировки их, используя 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...