Для группировки Python предоставляет itertools.groupby()
, который группирует отсортированный ввод по заданной ключевой функции.
В этом случае ввод должен быть сначала отсортирован поorg_id
, затем main_cat
, затем number
в порядке убывания, например, если ваши данные в виде списка выглядят так:
data = [
['Career', 'school', 5, 'A'],
['Career', 'college', 3, 'A'],
['Career', 'higher', 4, 'A'],
['Job', 'Blr', 6, 'A'],
['Job', 'Hyd', 11, 'A'],
['Job', 'Chennai', 12, 'A'],
['Career', 'school', 15, 'B'],
['Career', 'college', 30, 'B'],
['Career', 'higher', 5, 'B'],
['Job', 'Blr', 5, 'B'],
['Career', 'college', 8, 'C'],
['Job', 'Chennai', 4, 'C']
]
, вы бы отсортировали их так:
data.sort(key = lambda x: (x[3], x[0], -x[2]))
или, изменив свой оператор SQL на ORDER BY main_cat, sub_cat, number DESC
, вы получите его в правильном порядке из базы данных.
Теперь вы можете использовать groupby
для группировки иislice
для ограничения количества результатов по сгруппированной категории:
from itertools import groupby, islice
from operator import itemgetter
# already sorted data
data = [
['Career', 'school', 5, 'A'],
['Career', 'higher', 4, 'A'],
['Career', 'college', 3, 'A'],
['Job', 'Chennai', 12, 'A'],
['Job', 'Hyd', 11, 'A'],
['Job', 'Blr', 6, 'A'],
['Career', 'college', 30, 'B'],
['Career', 'school', 15, 'B'],
['Career', 'higher', 5, 'B'],
['Job', 'Blr', 5, 'B'],
['Career', 'college', 8, 'C'],
['Job', 'Chennai', 4, 'C']
]
data.sort(key = lambda x: (x[3], x[0], -x[2]))
for org, by_org in groupby(data, key=itemgetter(3)):
print("org:", org)
for cat, by_cat in islice(groupby(by_org, key=itemgetter(0)), 2):
print(" cat:", cat)
for subcat, by_subcat in islice(groupby(by_cat, key=itemgetter(1)), 2):
print(" subcat:", subcat, " = ", list(by_subcat))
Вывод:
org: A
cat: Career
subcat: school = [['Career', 'school', 5, 'A']]
subcat: higher = [['Career', 'higher', 4, 'A']]
cat: Job
subcat: Chennai = [['Job', 'Chennai', 12, 'A']]
subcat: Hyd = [['Job', 'Hyd', 11, 'A']]
org: B
cat: Career
subcat: college = [['Career', 'college', 30, 'B']]
subcat: school = [['Career', 'school', 15, 'B']]
cat: Job
subcat: Blr = [['Job', 'Blr', 5, 'B']]
org: C
cat: Career
subcat: college = [['Career', 'college', 8, 'C']]
cat: Job
subcat: Chennai = [['Job', 'Chennai', 4, 'C']]