Как сгруппировать объекты (кортежи) на основе наличия последовательного значения атрибута? - PullRequest
0 голосов
/ 17 апреля 2020

Я нашел похожий вопрос здесь: Как сгруппировать список кортежей / объектов по сходному индексу / атрибуту в python? , который говорит о группировании списка кортежей по сходным атрибутам. У меня есть список объектов; у объектов есть атрибут «день», и я хочу сгруппировать эти объекты на основе того, имеют ли они последовательные значения «день». например,

input = [('a',12),('b',13)('c',15),('d',16),('e',17)]

вывод:

[[('a',12),('b',13)],[('c',15),('d',16),('e',17)]]

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете сделать следующее:

from itertools import groupby, count
from operator import itemgetter

data = [('a', 12), ('b', 13), ('c', 15), ('c', 16), ('c', 17)]


def key(i, cursor=count(0)):
    """Generate the same key for consecutive numbers"""
    return i[1] - next(cursor)


ordered = sorted(data, key=itemgetter(1))

result = [list(group) for _, group in groupby(ordered, key=key)]
print(result)

Вывод

[[('a', 12), ('b', 13)], [('c', 15), ('c', 16), ('c', 17)]]

Вышеприведенный пример основан на старом примере, найденном в документации Python 2,6 здесь .

Чтобы лучше проиллюстрировать, что происходит, для следующего примера:

lst = [12, 13, 15, 16, 17]
print([v - i for i, v in enumerate(lst)])

Сгенерированные ключи:

[12, 12, 13, 13, 13]

Как видно, последовательные запуски иметь тот же ключ.

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