在Python3中构建嵌套词典时出现问题

2024-09-28 23:38:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想建立一个基于文本文件的嵌套字典。例如(文本.txt)

...
hostA           hostA.testing.com               192.168.1.101
hostB           hostB.testing.com               192.168.1.102
...

理想情况下,我希望得到以下嵌套字典

...
{'hostA': {'FQHN': 'hostA.testing.com', 'IP': '192.168.1.101'}, 'hostB': {'FQHN': 'hostB.testing.com', 'IP': '192.168.1.102'}}
...

因此,我编写了以下Python代码:

myinnerdict={}
myouterdict={}

def main():
    my_fh = open('text.txt', 'r')
    for line in my_fh:
        newline = line.strip().split()    # get ride of the '\n' and make it a inner list .
        #print(newline)
        myinnerdict['FQHN']=newline[1]
        myinnerdict['IP']=newline[2]
        #print(myinnerdict)
        #print(newline[0])
        myouterdict[newline[0]]=myinnerdict
    print(myouterdict)

if __name__ == "__main__":
    main()
...

然而,超出我的理解,当我运行它时,我得到了以下结果:

...
{'hostA': {'FQHN': 'hostB.testing.com', 'IP': '192.168.1.102'}, 'hostB': {'FQHN': 'hostB.testing.com', 'IP': '192.168.1.102'}}
...

这不是我想要的,我不知道我错过了什么,请帮忙


Tags: iptxtcom字典mainmynewlinetesting
2条回答

发生这种情况是因为您正在为innerdict重用相同的dict对象。您需要在循环中创建一个新的dict对象:

myouterdict={}

def main():
    my_fh = open('text.txt', 'r')
    for line in my_fh:
        myinnerdict={}
        newline = line.strip().split()    # get ride of the '\n' and make it a inner list .
        #print(newline)
        myinnerdict['FQHN']=newline[1]
        myinnerdict['IP']=newline[2]
        #print(myinnerdict)
        #print(newline[0])
        myouterdict[newline[0]]=myinnerdict
    print(myouterdict)

if __name__ == "__main__":
    main()

问题是您正在为字典重用相同的变量。由于myouterdict存储的是对变量myinnerdict的引用,而不是实际的数据,因此,它们是相同的。例如,尝试以下方法:

>>> a = {}
>>> b = {"my a variable": a}
>>> b
{'my a variable': {}}
>>> a["asdf"] = 3
>>> b
{'my a variable': {'asdf': 3}}

如您所见,b存储的是a的引用,而不是a的空dict数据。您需要做的是^{}将其覆盖(注意.copy()不会复制dict的内容,但会使新引用更here):

myinnerdict = {}
myouterdict = {}

def main():
    my_fh = open('text.txt', 'r')
    for line in my_fh:
        newline = line.strip().split()

        myinnerdict['FQHN'] = newline[1]
        myinnerdict['IP'] = newline[2]
        # Note this copy here
        myouterdict[newline[0]] = myinnerdict.copy()
    print(myouterdict)
    # Remember to close the file!
    my_fh.close()

if __name__ == "__main__":
    main()

无论如何,您也可以直接分配新创建的dict对象,而不是使用变量:

mydict = {}

def main():
    my_fh = open('test.txt', 'r')
    for line in my_fh:
        newline = line.strip().split()
        mydict[newline[0]] = {"FQHN": newline[1], "IP": newline[2]}
    print(mydict)
    my_fh.close()

if __name__ == "__main__":
    main()

相关问题 更多 >