Чтение строк из текста и преобразование его во вложенный словарь Python - PullRequest
0 голосов
/ 11 ноября 2018

Таким образом, у меня есть текст ниже в качестве входного файла:

A B 1
A C 2
B C 1
B D 3
B E 2
C D 1
C E 2
D E 4
D F 3
E F 3

и я хочу сохранить все эти значения во вложенном словаре в python:

{ 'A': {'B': 1, 'C': 2},
'B': {'C': 1, 'D': 3, 'E': 2},
'C': {'D': 1, 'E': 2},
'D': {'E': 4, 'F': 3},
'E': {'F': 3} }

Это мой код, который читает входной файл и пытается преобразовать его во вложенный словарь

inputfile = open("input.txt", "r")
lines = inputfile.readlines()
edges = []
for line in lines:
    edges.append(line.split())
d = {}
nn={}

for i in edges:
    nn.update({i[1]:i[2]})
    d[i[0]] = nn
    index+=1

print(d)

Это мой неверный вывод

{'A': {'B': '1', 'C': '1', 'D': '1', 'E': '4', 'F': '3'}, 'B': {'B': '1', 'C': '1', 'D': '1', 'E': '4', 'F': '3'}, 'C': {'B': '1', 'C': '1', 'D': '1', 'E': '4', 'F': '3'}, 'D': {'B': '1', 'C': '1', 'D': '1', 'E': '4', 'F': '3'}, 'E': {'B': '1', 'C': '1', 'D': '1', 'E': '4', 'F': '3'}}

Я ищу правильное условие if else, которое обновит элементы dict, когда ключ одинаковый, и добавит, если он другой. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Вы можете сделать:

di={}
with open(fn) as f_in:
    for line in f_in:
        li=line.split()
        di.setdefault(li[0],{})[li[1]]=li[2]

>>> di
{'A': {'B': '1', 'C': '2'}, 'B': {'C': '1', 'D': '3', 'E': '2'}, 'C': {'D': '1', 'E': '2'}, 'D': {'E': '4', 'F': '3'}, 'E': {'F': '3'}}
0 голосов
/ 11 ноября 2018

Вы можете использовать рекурсию с collections.defaultdict:

import collections
def group(d):
  _d = collections.defaultdict(list)
  for a, *b in d:
    _d[a].append(b)
  return {a:group(b) if len(b) > 1 else dict(b) if len(b[0]) > 1 else b[0][0] for a, b in _d.items()}

content = [i.strip('\n').split() for i in open('filename.txt')]
final_result = group(content)

Выход:

{'A': {'B': '1', 'C': '2'}, 'B': {'C': '1', 'D': '3', 'E': '2'}, 'C': {'D': '1', 'E': '2'}, 'D': {'E': '4', 'F': '3'}, 'E': {'F': '3'}}

Это также будет работать на больших входных выборках:

s = """
  A B C D
  A C D E
  A H I F
  B D T G
  B F E H
  B U F A
  """
content = [i.split() for i in filter(None, s.split('\n'))]
print(group(content))

Выход:

{'A': {'B': {'C': 'D'}, 'C': {'D': 'E'}, 'H': {'I': 'F'}}, 'B': {'D': {'T': 'G'}, 'F': {'E': 'H'}, 'U': {'F': 'A'}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...