我有一个如下所示的字典,我想编写一个递归函数来返回所有产品:
category = {'name': 'electronic_devices',
'sub_categories': [
{
'name': 'mobile-phone',
'sub_categories': [],
'products': [
'Sony xperia 1',
'Samsung Galaxy A32',
'Apple iphone 12',
'Xiaomi redmi 9'
]
},
{
'name': 'laptop',
'sub_categories': [
{
'name': 'ultrabook',
'sub_categories': [],
'products': [
'Asus ROG strix',
'Microsoft surface book 3',
'Lenovo ideapad 3'
]
}
],
'products': [
'Dell inspiron 3583-5278',
'HP pavilion dk1056wm'
]
}
],
'products': []
} 我的职责是:
def get_product(dic):
for k, v in dic.items():
if k == 'sub_categories':
return get_product(k)
elif k == 'products':
return v
print(get_product(category))此函数以错误结束。有人能帮我找出问题吗?
发布于 2021-09-03 04:00:39
你必须像这样迭代:
def get_product(dic):
x = []
for k, v in dic.items():
if k == 'sub_categories':
for i in v:
x.extend(get_product(i))
elif k == 'products':
x.extend(v)
return x
print(get_product(category))输出:
['Sony xperia 1Samsung Galaxy A32', 'Apple iphone 12', 'Xiaomi redmi 9', 'Asus ROG strix', 'Microsoft surface book 3', 'Lenovo ideapad 3', 'Dell inspiron 3583-5278', 'HP pavilion dk1056wm']发布于 2021-09-03 05:04:31
您不应该通过迭代键值对和匹配键来访问字典值,因为这样做效率低且不必要地冗长。直接按键访问字典值:
def get_product(d):
return [p for s in d['sub_categories'] for p in get_product(s)] + d['products']因此,get_product(category)返回:
['Sony xperia 1Samsung Galaxy A32', 'Apple iphone 12', 'Xiaomi redmi 9', 'Asus ROG strix', 'Microsoft surface book 3', 'Lenovo ideapad 3', 'Dell inspiron 3583-5278', 'HP pavilion dk1056wm']发布于 2021-09-03 04:23:06
不使用递归的解决方案。您只需为此目的使用队列即可。不管您的数据是如何嵌套的,这也会起作用。
category = {
'name': 'electronic_devices',
'sub_categories': [
{
'name': 'mobile-phone',
'sub_categories': [],
'products': [
'Sony xperia 1',
'Samsung Galaxy A32',
'Apple iphone 12',
'Xiaomi redmi 9'
]
},
{
'name': 'laptop',
'sub_categories': [
{
'name': 'ultrabook',
'sub_categories': [
{
'products': [
'Laser sword',
'Beyblade',
'Crush Gear'
]
}
],
'products': [
'Asus ROG strix',
'Microsoft surface book 3',
'Lenovo ideapad 3'
]
}
],
'products': [
'Dell inspiron 3583-5278',
'HP pavilion dk1056wm'
]
}
],
'products': ["Solar System Destructor Beta-3A"]
}
def get_products(dic):
products = []
queue = [dic]
while queue:
data = queue.pop()
if isinstance(data, dict):
products.extend(data.get('products', []))
queue.extend(data.values())
elif isinstance(data, list):
queue.extend(data)
return products
print(get_products(category))输出
['Solar System Destructor Beta-3A', 'Dell inspiron 3583-5278', 'HP pavilion dk1056wm', 'Asus ROG strix', 'Microsoft surface book 3', 'Lenovo ideapad 3', 'Laser sword', 'Beyblade', 'Crush Gear', 'Sony xperia 1', 'Samsung Galaxy A32', 'Apple iphone 12', 'Xiaomi redmi 9']https://stackoverflow.com/questions/69039328
复制相似问题