Poul Lirman
Ученик
(96),
на голосовании
2 дня назад
Есть бесконечный поток данных. Вы знаете, когда он закончится, и объём данных может превышать доступную оперативную память в разы. В этом потоке случайным образом распределены JSON-объекты, но не просто объекты, а с вложенными структурами произвольной глубины. Структура каждого объекта может отличаться. Задача – написать генератор на Python, который принимает этот поток данных на вход и выдаёт на выходе новый поток, где каждый JSON-объект нормализован. Нормализация – это преобразование вложенных структур в плоский словарь, используя dot-notation для ключей. Например, {"a": {"b": 1, "c": {"d": 2}}} превращается в {"a.b": 1, "a.c.d": 2}. При этом, нужно учитывать возможность появления одинаковых ключей на разных уровнях вложенности после нормализации, например, {"a": 1, "b": {"a": 2}}. В этом случае, нужно добавить индекс в квадратных скобках к повторяющимся ключам, начиная с 1: {"a": 1, "b.a": 2}. Если {"a": 1, "b": {"a": 2}, "c": {"b": {"a": 3}}}, то результат должен быть {"a": 1, "b.a": 2, "c.b.a": 3}.
Но это ещё не всё. Предположим, в потоке встречаются объекты с одинаковой нормализованной структурой. Нужно определить схему (т.е. все уникальные ключи после нормализации) для наиболее часто встречающейся структуры и выдавать на выходе только те объекты, которые соответствуют этой схеме, игнорируя остальные. При этом, решение должно быть максимально эффективным по памяти и скорости обработки, так как поток бесконечный, и ты не можешь хранить все данные в памяти. Нужно реализовать, используя генераторы и возможности Python для работы с JSON и динамической типизацией.
Но это ещё не всё. Предположим, в потоке встречаются объекты с одинаковой нормализованной структурой. Нужно определить схему (т.е. все уникальные ключи после нормализации) для наиболее часто встречающейся структуры и выдавать на выходе только те объекты, которые соответствуют этой схеме, игнорируя остальные. При этом, решение должно быть максимально эффективным по памяти и скорости обработки, так как поток бесконечный, и ты не можешь хранить все данные в памяти. Нужно реализовать, используя генераторы и возможности Python для работы с JSON и динамической типизацией.