所以我将以下文本作为输入文件:
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条件,该条件将在键相同时更新字典项,在键不同时附加。预先感谢。
答案 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'}}}