Как считать словарь со множествами из txt файла?

У меня есть словарь, записанный в .txt файл (как записан в файле показано ниже). Как считать его в программе? json не работает со множествами :с

0:{'1', '2'}
1:{'4', '0', '3'}
2:{'1'}
3:{'0'}
4:{'2', '3'}

Заранее спасибо за ответ!


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

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

У вас в каждой строке набор данных состоит из чисел. Заберите их и соберите так как вас устраивает

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'}}
→ Ссылка
Автор решения: CrazyElf

Ещё один вариант - дописать недостающие элементы до строкового представления словаря - фигурные скобки перед и после, ну и запятые между элементами - после чего применить 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 взято для воспроизводимости примера, в вашем случае будет чтение из обычного файла.

→ Ссылка