【问题标题】:Return specific values from a nested dictionary with a generator function使用生成器函数从嵌套字典中返回特定值
【发布时间】:2022-01-12 02:15:15
【问题描述】:

我有一个包含嵌套字典的字典列表,如下所示。我想使用生成器和 yield 来遍历 reviews dict 列表并返回所有 rating 给定特定的 user 值。例如 "user" : "A11" 有两条 rating 记录。我希望将这些作为 dict 返回。

data = [{ "product_id" : "123",
    "size" : "L",
    "color" : "blue",
    "reviews" : [
        { "user" : "A11", "rating" : "score1" },
        { "user" : "Z99", "rating" : "score" }] },

    { "product_id" : "987",
    "size" : "M",
    "color" : "red",
    "reviews" : [
        { "user" : "A11", "rating" : "score2" },
        { "user" : "X55", "rating" : "score" }] }
    ]

我有以下生成器,但它基本上返回所有rating 值,而不管user。如何使函数将值过滤到特定的 user

def user_rating(nest, kv):
    if isinstance(nest, list):
        for i in nest:
            for x in user_rating(i, kv):
                yield x
    elif isinstance(nest, dict):
        if kv in nest:
            yield nest[kv]
        for j in nest.values():
            for x in user_rating(j, kv):
                yield x

print(list(user_rating(data, 'rating')))

【问题讨论】:

    标签: python-3.x dictionary generator nested-lists yield


    【解决方案1】:

    稍微修改一下就足够了:

    def user_rating(nest, kv):
        if isinstance(nest, list):
            for i in nest:
                yield from user_rating(i, kv)
        elif isinstance(nest, dict):
            if nest.get('user') == kv: # <----- here
                yield nest # <---- and here
            for j in nest.values():
                yield from user_rating(j, kv)
                    
    print(list(user_rating(data, 'A11')))
    #[{'user': 'A11', 'rating': 'score1'}, {'user': 'A11', 'rating': 'score2'}]
    

    顺便说一句,您可以使用yield from 来...好吧,从另一个生成器产生而不是使用for 循环

    【讨论】:

    • 谢谢你,你是天赐之物!
    猜你喜欢
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2021-06-01
    • 1970-01-01
    • 2022-06-13
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多