从文本中读取行并将其转换为Python嵌套字典

时间:2018-11-11 00:22:53

标签: python python-3.x dictionary

所以我将以下文本作为输入文件:

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条件,该条件将在键相同时更新字典项,在键不同时附加。预先感谢。

2 个答案:

答案 0 :(得分:1)

您可以这样做:

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'}}

答案 1 :(得分:0)

您可以对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'}}}
相关问题