Добрый день. Задача следующая: в функцию передается словарь - ключи целые числа, значения списки с целыми числами.
Нужно объединить списки из словаря и вернуть список списков, чтобы длинна вложенного списка не превышала 4000, нельзя "разрывать" список словаря.
Вопрос в том как сделать это красиво? Реализация которая у меня получилась мне не нравится...
@staticmethod
def group_by_part_limit(tickets: t.Dict[int, list[int]]) -> t.List[t.List[int]]:
DEFAULT_PART_LIMIT = 4000
parts: list[list[int]] = []
while tickets:
part_tickets: list[int] = []
for house in list(tickets):
if len(part_tickets) + len(tickets.get(house)) < DEFAULT_PART_LIMIT:
part_tickets.extend(tickets.pop(house))
else:
break
parts.append(part_tickets)
return parts
Тест
@mark.parametrize(
'tickets, expected, part_count', [
({1: [1, 2, 3], 2: [4, 5, 6]}, [[1, 2, 3, 4, 5, 6]], 1),
({1: [i for i in range(1, 901)], 2: [i for i in range(901, 1801)], 3: [i for i in range(1801, 2701)],
4: [i for i in range(2701, 3601)], 5: [i for i in range(3601, 4501)]},
[[i for i in range(1, 3601)], [i for i in range(3601, 4501)]], 2),
]
)
async def test_group_by_part_limit(tickets: dict[int, list[int]], expected: list[list[int]], part_count: int):
result = SubTaskControl.group_by_part_limit(tickets)
assert_that(len(result), is_(part_count))
assert_that(result, is_(expected))