递归获取一个嵌套的字典项



我有一个像下面这样的字典,我想写一个递归函数来返回所有产品:

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))

这个函数以错误结束。谁能帮我找出问题所在吗?

你必须这样迭代:

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']

您不应该通过遍历键-值对并匹配键来访问字典值,因为这种方法效率低下且不必要的冗长。直接通过键访问字典值:

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']

不使用递归的解决方案。为此,您可以使用队列。无论你的数据是如何嵌套的,这也可以工作。

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']

最新更新