我正在通过读取大型CSV文件来创建多层嵌套字典。文件的内容采用以下格式,该格式存储与一本唯一书有关的相关信息。我们可以假设每一行有6列(作者,标题,年份,类别,URL,引用);所有列条目都具有相同的格式。例如:
Author,Title,Year,Category,Url,Citations
"jk rowling, etc....",goblet of fire,1973,magic: fantasy: english literature,http://doi.acm.org/10.1145/800010.808066,6
"Weiner, Leonard H.",cracking the coding interview,1973,LA: assessment: other,http://doi.acm.org/10.1145/800010.808105,2
"Tolkien",hobbit,1953,magic: fantasy: medieval,http://doi.acm.org/10.1145/800010.808066,6
我希望输出匹配CSV文件中每一行的解析方式,类似于以下内容: *(注意:嵌套字典的数量取决于csv的类别标题下的书籍类别。第一层深度(也称为第一子层)的键按书籍的实施年份排序。第二层及以后的键叶子进一步扩展了从第1子层开始的排序,但现在还基于连续的类别(排序事项),并以':'分隔符分隔。将CSV文件中每行类别的排序视为路径目录;多个文件可以一直使用相同的路径目录,或者可以具有相同的路径目录并放置在同一文件夹中。
results = {'1973':{
"magic": {
"fantasy": {
"English literature": {
"name": "goblet of fire",
"citations": 6,
"url": "http://doi.acm.org/10.1145/800010.808066"
}
},},
"medieval": {
"name": "The Hobbit",
"citations": 7,
"url": "http://doi.acm.org/10.1145/800fdfdffd010.808066"
}
},
{'1953': "la": {
"assessment": {
"other": {
"name": "cracking the coding interview",
"citations": 6,
"url": "http://doi.acm.org/10.1145/800010.808105"
}
}
}
}
}
很显然,有些书将具有共同的连续类别或共同的出版日期,就像我上面显示的示例一样。有些书可能还会共享完全相同的连续类别。我认为我应该递归地遍历csv中每行类别的字符串,要么创建新的子字典,使其偏离先前存在的类别顺序,然后在没有更多要检查的连续类别时创建该书的字典表示形式。我只是不确定该如何开始。
这是我到目前为止的内容,这只是读取CSV文件的标准设置:
_, *data = csv.reader(open(DATA_FILE))
new_data = [[i[3].split(': '), *i[4:], *i[:3]] for i in data]
print(json.dumps(group(new_data), indent=4))
return group(new_data)
def group(d):
_d = {}
for a, *b in d:
if a[0] not in _d:
_d[a[0]] = [[a[1:], *b]]
else:
_d[a[0]].append([a[1:], *b])
r = {a: {'books': [
{'name': c[-2],'year':c[-1], 'citations': c[2], 'url': c[1], 'author': c[3]} for
c in b if not c[0]], **(lambda x: {} if not x else group(x))(
[c for c in b if c[0]])} for a, b in _d.items()}
return {a: {c: d for c, d in b.items() if d} for a, b in r.items()}
本质上,我想使用嵌套字典创建此csv的树表示形式,第一层按发布日期排序,其后的层进一步扩展,并根据相对类别路径进一步订购书(即magic:fantasy :等...),确定要遍历/创建的子树。如果两本书或多本书具有相同的连续路径,我希望使所有这些书都具有各自的键,而不是在新书具有相同类别路径时覆盖每本书(叶)。叶子代表在csv中每行提到的书籍的字典表示。
编辑: 我不能使用任何依赖项/外部模块