Парсинг текстового файла, записанного в виде списка кортежей

На вход подается текстовый файл, который содержит список из трех списков с кортежами.

[ [(3, 5)], [((2, 2), 1)], [((3, 2), 1), ((2, 2), 2)] ]

На выходе нужен питоновский питоновский список кортежей

Я написала код, который справляется с задачей, но он мне кажется слишком "костыльным"

f = open('input.txt','r', encoding='utf8')

#парсинг текстового файла записанного в виде списка кортежей
k = f.read().replace(' ', '').strip('[[ ]]\n').split('],[')
#вывод для демонтсрации того, что все работает чисто
for i in k:
    print(i)
#парсинг в три списка с целыми значениями
my_list1 = list(map(int, k[0].strip('( )').split(',')))
tmp = k[1].strip('( )').split('),((')
my_list2 = [ tuple(map(int, i.replace(')', '').split(','))) for i in tmp]
tmp = k[2].strip('( )').split('),((')
my_list3 = [ tuple(map(int, i.replace(')', '').split(','))) for i in tmp]

Есть ли какие-нибудь библиотеки или методы, которые выполняют эту задачу?


Ответы (2 шт):

Автор решения: CrazyElf

Если я правильно всё понял, то используйте literal_eval:

from ast import literal_eval

lst = literal_eval("[ [(3, 5)], [((2, 2), 1)], [((3, 2), 1), ((2, 2), 2)] ]")
print(type(lst), lst)

Вывод:

<class 'list'> [[(3, 5)], [((2, 2), 1)], [((3, 2), 1), ((2, 2), 2)]]
→ Ссылка
Автор решения: Dmitry

Вот здесь посмотрите

>>> from ast import literal_eval as make_tuple

>>> for i in k:  
...   print(make_tuple(i)) 
(3, 5)
((2, 2), 1)
(((3, 2), 1), ((2, 2), 2))

на выходе будут кортежи, которые можно в лист

→ Ссылка