【问题标题】:python Trying to access nested dict elementpython试图访问嵌套的dict元素
【发布时间】:2020-10-26 09:23:08
【问题描述】:

{"type":"product","**products**":[
{"id":466501,"title":"Nicholas Cole    Cellars GraEagle Red    Wing","image":"https://spoonacular.com/productImages/466501-312x231.jpg","imageType":"jpg"},
{"id":455061,"title":"Wieninger    Wiener Gemischter    Satz","image":"https://spoonacular.com/productImages/455061-312x231.jpg","imageType":"jpg"},
{"id":452162,"title":"The    Magnificent Wine Company Steak    House","image":"https://spoonacular.com/productImages/452162-312x231.jpg","imageType":"jpg"},
{"id":464255,"title":"Chateau    Morrisette Black    Dog","image":"https://spoonacular.com/productImages/464255-312x231.jpg","imageType":"jpg"},
{"id":434441,"title":"Dr.    Konstantin Frank    Gewurztraminer","image":"https://spoonacular.com/productImages/434441-312x231.jpg","imageType":"jpg"},
{"id":451567,"title":"Delectus    Dirty Old Dog (    Magnum)","image":"https://spoonacular.com/productImages/451567-312x231.jpg","imageType":"jpg"},
{"id":437451,"title":"Bleasdale    Frank Potts Red    Blend","image":"https://spoonacular.com/productImages/437451-312x231.jpg","imageType":"jpg"},
{"id":451606,"title":"Dr.    Konstantin Frank    Rkatsiteli","image":"https://spoonacular.com/productImages/451606-312x231.jpg","imageType":"jpg"},
{"id":440486,"title":"Dog    House Checker's    Cab","image":"https://spoonacular.com/productImages/440486-312x231.jpg","imageType":"jpg"},
{"id":445496,"title":"Dog    House Charlie's    Chard","image":"https://spoonacular.com/productImages/445496-312x231.jpg","imageType":"jpg"}],
"offset":0,"number":10,"totalProducts":7573,"processingTimeMs":380,"expires":1594279471761}

注意:这是 API 数据!

我正在尝试访问产品列表内容,我该怎么做?

这是我的代码

product = input("enter any food name: ")
   url = 'https://api.spoonacular.com/food/products/search?query={product}&apiKey=7c467a28410940378d56e53829f5efb6&q='
   req = requests.get(url).json()
   data_dict = dict(req)
   for product in data_dict['products']:
       print(product['id'])

【问题讨论】:

    标签: python api dictionary


    【解决方案1】:

    如果您的数据如下所示:

    data = [
        {
            "type": "product",
            "products": [
                {
                    "id": 466501,
                    "title": "Nicholas Cole Cellars GraEagle Red Wing",
                    "image": "https://spoonacular.com/productImages/466501-312x231.jpg","imageType":"jpg"
                }
                # ...
            ]
        }
    
        # ...
    ]
    

    要获取第一个商品的第一个产品的 id,您可以:

    print(data[0]["products"][0]["id"])
    

    【讨论】:

      【解决方案2】:

      给定字典d

      d = {"type":"product","**products**":[{"id":466501,"title":"Nicholas Cole Cellars GraEagle Red Wing","image":"https://spoonacular.com/productImages/466501-312x231.jpg","imageType":"jpg"},{"id":455061,"title":"Wieninger Wiener Gemischter Satz","image":"https://spoonacular.com/productImages/455061-312x231.jpg","imageType":"jpg"},{"id":452162,"title":"The Magnificent Wine Company Steak House","image":"https://spoonacular.com/productImages/452162-312x231.jpg","imageType":"jpg"},{"id":464255,"title":"Chateau Morrisette Black Dog","image":"https://spoonacular.com/productImages/464255-312x231.jpg","imageType":"jpg"},{"id":434441,"title":"Dr. Konstantin Frank Gewurztraminer","image":"https://spoonacular.com/productImages/434441-312x231.jpg","imageType":"jpg"},{"id":451567,"title":"Delectus Dirty Old Dog ( Magnum)","image":"https://spoonacular.com/productImages/451567-312x231.jpg","imageType":"jpg"},{"id":437451,"title":"Bleasdale Frank Potts Red Blend","image":"https://spoonacular.com/productImages/437451-312x231.jpg","imageType":"jpg"},{"id":451606,"title":"Dr. Konstantin Frank Rkatsiteli","image":"https://spoonacular.com/productImages/451606-312x231.jpg","imageType":"jpg"},{"id":440486,"title":"Dog House Checker's Cab","image":"https://spoonacular.com/productImages/440486-312x231.jpg","imageType":"jpg"},{"id":445496,"title":"Dog House Charlie's Chard","image":"https://spoonacular.com/productImages/445496-312x231.jpg","imageType":"jpg"}],"offset":0,"number":10,"totalProducts":7573,"processingTimeMs":380,"expires":1594279471761}
      

      您可以将所有数据取消嵌套到单个数据框中:

      df = pd.DataFrame.from_dict(d)
      df = pd.concat([df.drop(columns = ['**products**']), df['**products**'].apply(pd.Series)], axis = 1)
      

      输出数据帧结构df.dtypes:

      type                object
      offset               int64
      number               int64
      totalProducts        int64
      processingTimeMs     int64
      expires              int64
      id                   int64
      title               object
      image               object
      imageType           object
      dtype: object
      

      现在只需选择相关列。

      【讨论】:

        【解决方案3】:

        要仅提取产品数据,请使用专用方法json_normalize

        from pandas.io.json import json_normalize
        d = {"type":"product","**products**":[{"id":466501,"title":"Nicholas Cole Cellars GraEagle Red Wing","image":"https://spoonacular.com/productImages/466501-312x231.jpg","imageType":"jpg"},{"id":455061,"title":"Wieninger Wiener Gemischter Satz","image":"https://spoonacular.com/productImages/455061-312x231.jpg","imageType":"jpg"},{"id":452162,"title":"The Magnificent Wine Company Steak House","image":"https://spoonacular.com/productImages/452162-312x231.jpg","imageType":"jpg"},{"id":464255,"title":"Chateau Morrisette Black Dog","image":"https://spoonacular.com/productImages/464255-312x231.jpg","imageType":"jpg"},{"id":434441,"title":"Dr. Konstantin Frank Gewurztraminer","image":"https://spoonacular.com/productImages/434441-312x231.jpg","imageType":"jpg"},{"id":451567,"title":"Delectus Dirty Old Dog ( Magnum)","image":"https://spoonacular.com/productImages/451567-312x231.jpg","imageType":"jpg"},{"id":437451,"title":"Bleasdale Frank Potts Red Blend","image":"https://spoonacular.com/productImages/437451-312x231.jpg","imageType":"jpg"},{"id":451606,"title":"Dr. Konstantin Frank Rkatsiteli","image":"https://spoonacular.com/productImages/451606-312x231.jpg","imageType":"jpg"},{"id":440486,"title":"Dog House Checker's Cab","image":"https://spoonacular.com/productImages/440486-312x231.jpg","imageType":"jpg"},{"id":445496,"title":"Dog House Charlie's Chard","image":"https://spoonacular.com/productImages/445496-312x231.jpg","imageType":"jpg"}],"offset":0,"number":10,"totalProducts":7573,"processingTimeMs":380,"expires":1594279471761}
        products = json_normalize(d['**products**'])
        

        产生的数据帧结构products.dtypes:

        id            int64
        title        object
        image        object
        imageType    object
        dtype: object
        

        上述解决方案非常快。

        【讨论】:

          【解决方案4】:

          试试

          for product in data_dict['**products**']:
              print(product['id'])
          

          输出

          466501
          455061
          452162
          464255
          434441
          451567
          437451
          451606
          440486
          445496
          

          【讨论】:

          • 谢谢。这是我无法检索任何 id 的代码。 product = input("输入任何食物名称:") url = 'api.spoonacular.com/food/products/search?query={product}&apiKey=7c467a28410940378d56e53829f5efb6&q=' req = requests.get(url).json() data_dict = dict(req) #print(data_dict) for data_dict['products'] 中的产品: print(product['id'])
          • 我无权访问您的勺形端点。为什么不用data_dict 的值更新您的帖子?
          • @ABDULGHANIALRAWI json 是 print(data_dict) 的输出吗?如果是这样,请尝试我更新的帖子
          猜你喜欢
          • 2022-12-06
          • 1970-01-01
          • 2021-07-09
          • 2016-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-28
          相关资源
          最近更新 更多