如何在特定规则下使用以下csv创建深度嵌套的python字典

时间:2019-04-05 08:45:03

标签: python csv dictionary recursion tree

我正在通过读取大型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中每行提到的书籍的字典表示。

编辑: 我不能使用任何依赖项/外部模块

0 个答案:

没有答案