Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从文本中读取行并将其转换为Python嵌套字典_Python_Python 3.x_Dictionary - Fatal编程技术网

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

从文本中读取行并将其转换为Python嵌套字典,python,python-3.x,dictionary,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} } 这是我的代码,它正在读取输入文件并试图将其转换为嵌套字典

因此,我将以下文本作为输入文件:

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项,如果键不同则追加。提前感谢。

您可以对
集合使用递归。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'}}
{'A': {'B': {'C': 'D'}, 'C': {'D': 'E'}, 'H': {'I': 'F'}}, 'B': {'D': {'T': 'G'}, 'F': {'E': 'H'}, 'U': {'F': 'A'}}}
这也适用于较大的输入样本:

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': '1', 'C': '2'}, 'B': {'C': '1', 'D': '3', 'E': '2'}, 'C': {'D': '1', 'E': '2'}, 'D': {'E': '4', 'F': '3'}, 'E': {'F': '3'}}
{'A': {'B': {'C': 'D'}, 'C': {'D': 'E'}, 'H': {'I': 'F'}}, 'B': {'D': {'T': 'G'}, 'F': {'E': 'H'}, 'U': {'F': 'A'}}}
你可以做:

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

非常感谢您的快速回复和内容丰富的回答。我还在学习Python的基础知识,这确实帮助我理解了递归的概念。