社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python defaultdict深度嵌套数据结构

commentallez-vous • 5 年前 • 788 次点击  

我有一个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
 
788 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Martijn Pieters
Reply   •   1 楼
Martijn Pieters    5 年前

你的规格说明你想要的 '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开始的整数键构建一个外部字典。你也可以把它列出来。