Как превратить список строк в список кортежей, найдя в них самые большие повторяющиеся шаблоны в python3?
Я пытался найти решение своей проблемы в течение некоторого времени, но пока не нашел ни одной хорошей идеи.
У меня есть список больших строк, в которых повторяются некоторые шаблоны символов (без пробелов). Для моих нужд мне нужно уменьшить объем памяти, который занимают эти строки, найдя эти шаблоны и преобразовав список строк в два списка: один список, в котором все шаблоны набраны один раз, и один список, в котором есть кортежи/списки указателей на шаблон list, чтобы исходную строку можно было воссоздать из кортежа.
Например, для списка строк['FOOBAR', 'BARFOO']
я хотел бы получить['FOO', 'BAR'], [(0, 1), (1, 0)]
Слова в списке шаблонов должны иметь длину не менее 2 (если у нас нет другого выбора, например, если между двумя повторяющимися шаблонами есть только один символ или вся входная строка имеет длину только 1) - или лучше всего как можно дольше (поскольку адресация также занимает память, поэтому, если какое-то слово встречается один раз, оно должно иметь только один указатель, а не несколько).
Кроме того, алгоритм должен быть быстрым (лучшая линейная сложность), поскольку мой скрипт выполняет эту операцию на вводе пользователя, и я не хочу, чтобы мой пользователь ждал слишком долго.
Ниже я показываю пример скрипта, как это должно работать:
def getLists(str_list):
# code here
return pointers, out_strings
strings = ["FGJohnyRFGDERT", "VBSJohnR", "AAERFGR"]
pointers, out_strings = getLists(strings)
print(pointers, out_strings)
# [(0, 1, 2, 0, 3, 4, 5), (6, 1, 7), (8, 4, 0, 7)]["FG", "John", "yR", "D", "ER", "T", "VBS", "R", "AA"]
Заранее спасибо за помощь! <3
РЕДАКТИРОВАТЬ: кто-то предложил сжатие, такое как zlib. К сожалению, мне нужно распаковать исходные строки в малом объеме памяти и на очень простом языке, который не поддерживает zlib. Таким образом, хотя алгоритм сжатия может быть очень сложным, распаковка должна быть максимально простой.
1 ответ
Это похоже на проблему со сжатием. Существует множество библиотек сжатия.zlib
это тот, который поставляется со стандартной библиотекой и делает достойную работу по уменьшению размеров.
Другая мысль заключается в том, что вы можете изменить структуры данных. Например, вместо a изstr
, попробуйтеlist
изbytes
илиbytearray
с настраиваемым протоколом поиска и сегментации данных.
Во всяком случае, вот пример использования zlib:
import zlib
compressed_strings = [
zlib.compress(string.encode(), 9)
for string in strings
]
assert strings == [
zlib.decompress(compressed_string)
for compressed_string in compressed_strings
]
Лучший,