Py学习  »  Python

python defaultdict深度嵌套数据结构

commentallez-vous • 7 年前 • 1649 次点击  

我有一个Excel数据集列表,其中包含以下某些信息:

Category    Subcategory    Name
Main Dish   Noodle         Tomato Noodle
Main Dish   Stir Fry       Chicken Rice
Main Dish   Soup           Beef Goulash
Drink       Wine           Bordeaux
Drink       Softdrink      Cola

假设上述数据集只是其中一个数据集,我使用嵌套dict和list所需的数据结构是:

data = {0:{'data':0, 'Category':[
                                 {'name':'Main Dish', 'Subcategory':[
                                                       {'name':'Noodle', 'key':0, 'data':['key':1, 'title':'Tomato Noodle']},
                                                       {'name':'Stir Fry', 'key':1, 'data':['key':2, 'title':'Chicken Rice']},
                                                       {'name':'Soup', 'key':2, 'data':['key':3, 'title':'Beef Goulash']}]},
                                  {'name':'Drink', 'Subcategory':[
                                                       {'name':'Wine', 'key':0, 'data':['key':1, 'title':'Bordeaux']},
                                                       {'name':'Softdrink', 'key':1, 'data':['key':2, 'title':'cola'}]}]},
        1:{'data':1, 'Category':.........#Same structure as dataset 0}}

所以基本上,整个类别是一个默认的dict(list),每个不同的类别在整个类别列表中形成一个dict。不同的子类别也是如此,但是子类别遵循类别。

我试着用默认的dict来做,下面是我的代码:

from collections import defaultdict
data = defaultdict(dict)
cateList = ["Main Dish", "Drink"]
n = 3 # n means the number of datasets
for i in range(n):
    data[i]['data'] = i
    data[i]['category'] = defaultdict(list) 
    for j in range(len(cateList)):
        data[i]['category'][j]['name'] = cateList[j]
        data[i]['category'][j]['subcategory'] = defaultdict(list)
data

但我收到以下错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-81-298f7ff30c6a> in <module>()
      5     data[i]['category'] = defaultdict(list)
      6     for j in range(len(cateList)):
----> 7         c
      8         data[i]['category'][j]['subcategory'] = defaultdict(list)
      9 data

TypeError: list indices must be integers or slices, not str

这是在Jupyter笔记本中执行的,并且似乎不允许我以这种方式指示嵌套的defaultdict:data[i]['category'][j]['name']=catelist[j]。所以我不太确定如何构建上述数据结构……有更好的方法吗?

非常感谢你的帮助。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30655
文章 [ 1 ]  |  最新文章 7 年前
Martijn Pieters
Reply   •   1 楼
Martijn Pieters    7 年前

你的规格说明你想要的 'Category' 引用一个 列表 :

data = {0:{'data':0, 'Category':[
#                               ^ a list opening bracket

但是,你的代码使它成为一本字典:

data[i]['category'] = defaultdict(list) 

但是您的代码的其余部分会尝试处理 'category' 通过使用,再次将对象作为列表 j 作为索引。因为它是一本字典 data[i]['category'][j] 生成列表,以及 data[i]['category'][j]['name'] data[i]['category'][j]['subcategory'] 尝试用字符串索引该列表。

建造这个结构并不需要 defaultdict ;你已经知道你想要 建造 数据,您正在用循环构建嵌套结构。您只需使用常规词典和列表:

cateList = ["Main Dish", "Drink"]
n = 3 # n means the number of datasets

data = {}
for i in range(n):
    data[i] = {
        'data': i,
        'category': []
    }
    category = data[i]['category']
    for name in cateList:
        category.append({
            'name': name,
            'subcategory': []
        })

我不太清楚为什么要用从0开始的整数键构建一个外部字典。你也可以把它列出来。