Python defaultdict 深层嵌套数据结构
Python defaultdict deep nested data structure
我有一个 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
假设上面的数据集只是其中一个数据集,我想要的使用嵌套字典和列表的数据结构是:
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}}
所以基本上,整个类别是一个默认字典(列表),每个不同的类别在整个类别列表中形成一个字典。不同的子类别也是如此,但子类别遵循类别。
我尝试使用 defaultdict 来完成,这是我的代码:
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 Notebook中执行的,它似乎不允许我以这种方式指示嵌套的defaultdict:data[i]['category'][j]['name'] = 分类列表[j]。所以我不太确定如何构造上面的数据结构...有没有更好的方法?
非常感谢您的帮助。
您的规范声明您希望 'Category'
引用 list:
data = {0:{'data':0, 'Category':[
# ^ a list opening bracket
但是,您的代码使其成为字典:
data[i]['category'] = defaultdict(list)
但是您的代码的其余部分然后尝试通过使用 j
作为索引再次将 'category'
对象视为列表。因为它是一个字典,所以表达式 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 开始的整数键构建一个外部字典。你也可以把它做成一个列表。
我有一个 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
假设上面的数据集只是其中一个数据集,我想要的使用嵌套字典和列表的数据结构是:
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}}
所以基本上,整个类别是一个默认字典(列表),每个不同的类别在整个类别列表中形成一个字典。不同的子类别也是如此,但子类别遵循类别。
我尝试使用 defaultdict 来完成,这是我的代码:
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 Notebook中执行的,它似乎不允许我以这种方式指示嵌套的defaultdict:data[i]['category'][j]['name'] = 分类列表[j]。所以我不太确定如何构造上面的数据结构...有没有更好的方法?
非常感谢您的帮助。
您的规范声明您希望 'Category'
引用 list:
data = {0:{'data':0, 'Category':[
# ^ a list opening bracket
但是,您的代码使其成为字典:
data[i]['category'] = defaultdict(list)
但是您的代码的其余部分然后尝试通过使用 j
作为索引再次将 'category'
对象视为列表。因为它是一个字典,所以表达式 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 开始的整数键构建一个外部字典。你也可以把它做成一个列表。