Как считать словарь со множествами из txt файла?
У меня есть словарь, записанный в .txt файл (как записан в файле показано ниже). Как считать его в программе? json не работает со множествами :с
0:{'1', '2'}
1:{'4', '0', '3'}
2:{'1'}
3:{'0'}
4:{'2', '3'}
Заранее спасибо за ответ!
Ответы (3 шт):
У вас в каждой строке набор данных состоит из чисел. Заберите их и соберите так как вас устраивает
txt = """0:{'1', '2'}
1:{'4', '0', '3'}
2:{'1'}
3:{'0'}
4:{'2', '3'}
"""
d = txt.split("\n")
result = {}
for line in d:
inst = []
for letter in line:
if letter.isdigit():
inst.append(letter)
if inst:
result[int(inst[0])] = set(inst[1:])
или короче
for line in d:
inst = [letter for letter in line if letter.isdigit()]
if inst:
result[int(inst[0])] = set(inst[1:])
Разбираем каждую строку регулярным выражением на группы цифр. Первую группу применяем как ключ, из остальных формируем множество и помещаем это всё в словарь.
import re
out, pat = {}, re.compile('\d+')
with open(r'c:\test\sets.txt', 'r') as sets:
for line in sets.readlines():
res = pat.findall(line)
out[res[0]] = set(res[1:])
print(out)
{'0': {'2', '1'}, '1': {'3', '4', '0'}, '2': {'1'}, '3': {'0'}, '4': {'2', '3'}}
Ещё один вариант - дописать недостающие элементы до строкового представления словаря - фигурные скобки перед и после, ну и запятые между элементами - после чего применить literal_eval:
from io import StringIO
from ast import literal_eval
data = """\
0:{'1', '2'}
1:{'4', '0', '3'}
2:{'1'}
3:{'0'}
4:{'2', '3'}"""
with StringIO(data) as f:
data_str = '{' + ','.join(f.readlines()) + '}'
dict_ = literal_eval(data_str)
print(dict_)
Вывод:
{0: {'1', '2'}, 1: {'4', '3', '0'}, 2: {'1'}, 3: {'0'}, 4: {'3', '2'}}
Чтение из StringIO взято для воспроизводимости примера, в вашем случае будет чтение из обычного файла.