从文本中读取行并将其转换为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的基础知识,这确实帮助我理解了递归的概念。