Это прекрасная возможность использовать yield
, чтобы превратить вашу функцию в генератор. Генератор может выдавать целую кучу элементов и вести себя как список или другой итеративный элемент. Вызывающий цикл перебирает свое возвращаемое значение и получает по одному полученному элементу каждую итерацию, пока не вернется функция.
def get_keys(input_dict):
for key, value in input_dict.items():
if isinstance(value, dict):
for subkey in get_keys(value):
yield key + '/' + subkey
else:
yield key
for key in get_keys(my_dict):
print(key)
Внутри внешнего цикла for
каждое значение является либо dict, либо простым значением. Если это простая величина, просто дайте ключ. Если это диктат, повторите его и добавьте key + '/'
к каждому подразделу.
path_list
и current_path
ушли. get_keys()
просто возвращает строки одну за другой, а операторы yield
и рекурсивный цикл заставляют выпрямление клавиш естественным образом вытряхиваться.
stream1/dataset1/value1
dataset2/value1
dataset2/value2
stream2/dataset3/value4
stream3/value5
Хорошая книга по этой теме является Книгой Сжатия данных. Это начинается с основами и заканчивается с JPEG и фрактальными алгоритмами сжатия изображения.
Я работал через эту целую книгу несколько лет назад (первый выпуск, я думаю), и я все еще помню это как действительно полезный опыт.
Я нахожу, что Википедия является довольно хорошим источником в этом отношении. Посмотрите, например, Кодирование методом Хаффмана, LZW и Выкачайте для некоторых общих алгоритмов сжатия данных общего назначения без потерь.
Если Вы хотите сделать что-то более определенное, статья о JPEG также действительно хороша.
Эта конкуренция дает хорошую идею текущего уровня техники для текстового сжатия и чего-то, чтобы стремиться при предложении чего-то хорошего!
Я нашел это полезным обзором сжатия изображения без потерь.
Если Вы только для чтения одна научная работа на предмете, сделайте это C.E. Шеннон "Математическая Теория Коммуникации". Идеи там абсолютно фундаментальны для сжатия.
Это - полностью не ответ, но.... Сжатие и Распаковка, для меня, действительно никогда не имели высокого процента. В Системе существуют классы сжатия. IO.Compression и те вещи заботятся о нем для меня. Что больше я должен знать? Если встроенные классы не достаточны, существует сторонний класс, освобождает.
(На самом деле классы DeflateStream и GZipStream в.NET показывают аномальное поведение с ранее сжатыми данными: они могут на самом деле увеличить размер данных, которые их просят сжать.Ой! Об этом сообщили как проблема, но выстрел был отклонен прочь щита Borg: Подключение.
Благодарность Microsoft для требования общедоступных отчетов об ошибках; Bados на Microsoft для просто Заключительных ошибок они не испытывали желание фиксировать.)