【问题标题】:How to find the values of a key in a nested list of dictionaries in Python如何在 Python 中的嵌套字典列表中查找键的值
【发布时间】:2022-01-06 19:53:29
【问题描述】:

这是我的数据结构。我在“衣服列表”中有 3000 个“产品”实例。每个都包含另一个存储评论的字典列表。

clothes_list = 
[
  {
    "ID": "1000201",
    "Name": "Clothes Name",
    "Price": 24.1,
    "Category": "Trousers"
    "Reviews": [{'User': 'username1200', 'Review': 'some review', 'Score': 2}
                  {'User': 'username341', 'Review': 'Some review 2' , 'Score': 4}
                  {'User': 'username34841', 'Review': 'Some review 3' , 'Score': 2}
               ]
  },

  {
    "ID": "1003801",
    "Name": "Clothes Name",
    "Price": 29.1,
    "Category": "Trousers"
    "Reviews": [{'User': 'username1200', 'Review': 'some review', 'Score': 2}
                  {'User': 'username341', 'Review': 'Some review 4' , 'Score': 7}
                  {'User': 'username34841', 'Review': 'Some review 5' , 'Score': 4}
               ]
  },
  
]

我正在尝试遍历字典中的所有评论并返回由特定用户名撰写的所有评论。

我下面的两次尝试输出相同的错误。

username = "username341"
reviews = next((review for review in clothess_list if review["Reviews"]["User"] == username))]
values = [a_dict["Reviews"][username] for a_dict in clothes_list]

错误

TypeError: 列表索引必须是整数或切片,而不是 str

目标输出

{'User': 'username341', 'Review': 'Some review 2' , 'Score': 4}, 
{'User': 'username341', 'Review': 'Some review 4' , 'Score': 7}

【问题讨论】:

    标签: python python-3.x list dictionary list-comprehension


    【解决方案1】:

    您的逻辑 review["Reviews"]["User"] 不能迭代,因为 Reviews 是一个字典列表。您不能直接调用字典而不放置任何列表索引。

    username = "username341"
    reviews=next( user for review in clothes_list for user in review['Reviews'] if user['User']==username)
        
    print(reviews)
    

    输出

    {'User': 'username341', 'Review': 'Some review 2', 'Score': 4}
    

    【讨论】:

    • 您好,您的解决方案仅返回列表中用户名的第一个评论实例。有什么建议可以更改代码以便返回用户评论的所有实例?
    • 使用list 然后代替next,如list(user for review in clothes_list for user in review['Reviews'] if user['User']==username)[user for review in clothes_list for user in review['Reviews'] if user['User']==username]
    • 现在工作我按照你的建议使用list,谢谢。
    【解决方案2】:

    您的尝试不正确,因为您将列表视为字典。以下 sn-p 解决了您的问题,但它可能不是最好的方法。

    reviews = next(
        c for c in clothes_list 
        if any(review for review in c["Reviews"] if review["User"] == username)
    )
    

    【讨论】:

      【解决方案3】:

      我发现把它写成多行是最简单的,就像我在写多个 for 循环一样

      [review
       for clothes_item in clothes_list
       for review in clothes_item["Reviews"]
       if review["User"] = username
      ]
      

      如果需要,您当然可以通过将 [] 替换为 () 来将其变成生成器

      【讨论】:

        【解决方案4】:

        试试这个:

        clothes_list = [{
            "ID": "1000201",
            "Name": "Clothes Name",
            "Price": 24.1,
            "Category": "Trousers",
            "Reviews": [{
                "User": "username1200", "Review": "some review", "Score": 2
            }, {'User': 'username341', 'Review': 'Some review 2', 'Score': 4},
                {'User': 'username34841', 'Review': 'Some review 3', 'Score': 2},{
                "User": "username1200", "Review": "some review 4 by same user", "Score": 2
            },]
        }]
        
        
        def get_reviews(username):
            a = []
            for i in range(len(clothes_list)):
                for x in clothes_list[i]["Reviews"]:
                    if x["User"] == username:
                        a.append(x)
        
            return a
        
        print(get_reviews("username1200"))
        

        其他人的答案也是正确的,只是数据集只包含每个用户的一条评论。我已编辑数据集以包含来自 username1200 的 2 条评论

        使用我提供的数据集尝试其他答案,它将在列表中返回 2 个字典。

        【讨论】:

          猜你喜欢
          • 2022-06-15
          • 2013-09-20
          • 2022-07-05
          • 1970-01-01
          • 2016-11-14
          • 1970-01-01
          • 2019-07-18
          • 1970-01-01
          • 2020-02-16
          相关资源
          最近更新 更多