首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归获取嵌套字典项

递归获取嵌套字典项
EN

Stack Overflow用户
提问于 2021-09-03 03:58:39
回答 3查看 81关注 0票数 0

我有一个如下所示的字典,我想编写一个递归函数来返回所有产品:

代码语言:javascript
复制
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': []
            } 

我的职责是:

代码语言:javascript
复制
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))

此函数以错误结束。有人能帮我找出问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-03 04:00:39

你必须像这样迭代:

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
['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']
票数 2
EN

Stack Overflow用户

发布于 2021-09-03 05:04:31

您不应该通过迭代键值对和匹配键来访问字典值,因为这样做效率低且不必要地冗长。直接按键访问字典值:

代码语言:javascript
复制
def get_product(d):
    return [p for s in d['sub_categories'] for p in get_product(s)] + d['products']

因此,get_product(category)返回:

代码语言:javascript
复制
['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']
票数 1
EN

Stack Overflow用户

发布于 2021-09-03 04:23:06

不使用递归的解决方案。您只需为此目的使用队列即可。不管您的数据是如何嵌套的,这也会起作用。

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
['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']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69039328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档