gpt4 book ai didi

python - 在Python中构建嵌套字典从文件中逐行读取

转载 作者:行者123 更新时间:2023-11-30 23:32:49 24 4
gpt4 key购买 nike

我处理嵌套字典的方式是这样的:

dicty = dict()
tmp = dict()
tmp["a"] = 1
tmp["b"] = 2
dicty["A"] = tmp

dicty == {"A" : {"a" : 1, "b" : 1}}

当我尝试在一个大文件上逐行读取时,问题就开始了。这是打印列表中每行的内容:

['proA', 'macbook', '0.666667']
['proA', 'smart', '0.666667']
['proA', 'ssd', '0.666667']
['FrontPage', 'frontpage', '0.710145']
['FrontPage', 'troubleshooting', '0.971014']

我想最终得到一个嵌套字典(忽略小数):

{'FrontPage': {'frontpage': '0.710145', 'troubleshooting': '0.971014'},
'proA': {'macbook': '0.666667', 'smart': '0.666667', 'ssd': '0.666667'}}

当我逐行阅读时,我必须检查第一个单词是否仍然在文件中找到(它们都已分组),然后才能将其作为完整的字典添加到更高的字典中。

这是我的实现:

def doubleDict(filename):
dicty = dict()
with open(filename, "r") as f:
row = 0
tmp = dict()
oldword = ""
for line in f:
values = line.rstrip().split(" ")
print(values)
if oldword == values[0]:
tmp[values[1]] = values[2]
else:
if oldword is not "":
dicty[oldword] = tmp
tmp.clear()
oldword = values[0]
tmp[values[1]] = values[2]
row += 1
if row % 25 == 0:
print(dicty)
break #print(row)
return(dicty)

我实际上很想在 pandas 中使用它,但现在如果它能作为字典使用,我会很高兴。由于某种原因,在阅读了前 5 行后,我最终得到:

{'proA': {'frontpage': '0.710145', 'troubleshooting': '0.971014'}},

这显然是不正确的。怎么了?

最佳答案

使用 collections.defaultdict() object自动实例化嵌套字典:

from collections import defaultdict

def doubleDict(filename):
dicty = defaultdict(dict)
with open(filename, "r") as f:
for i, line in enumerate(f):
outer, inner, value = line.split()
dicty[outer][inner] = value
if i % 25 == 0:
print(dicty)
break #print(row)
return(dicty)

我在这里使用了enumerate()来生成行数;比保持一个单独的计数器简单得多。

即使没有 defaultdict,您也可以让外部字典保留对嵌套字典的引用,并使用 values[0] 再次检索它;无需保留 temp 引用:

>>> dicty = {}
>>> dicty['A'] = {}
>>> dicty['A']['a'] = 1
>>> dicty['A']['b'] = 2
>>> dicty
{'A': {'a': 1, 'b': 1}}

所有的 defaultdict 所做的就是让我们不必测试我们是否已经创建了该嵌套字典。而不是:

if outer not in dicty:
dicty[outer] = {}
dicty[outer][inner] = value

我们只需省略 if 测试,因为如果 key 尚不存在,defaultdict 将为我们创建一个新字典。

关于python - 在Python中构建嵌套字典从文件中逐行读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19203684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com