【问题标题】:Appending Python Dictionaries to a List将 Python 字典附加到列表
【发布时间】:2020-10-14 04:31:20
【问题描述】:

我正在尝试将 GraphQL 查询的输出作为 JSON 进行迭代,并创建一个包含该信息的 Python dicts 列表(“项目”变量)。这是我到目前为止一直在使用的代码:

url = 'https://api.github.com/graphql'
api_token = 'API_TOKEN'
headers = {'Authorization': 'token %s' % api_token}

# Parse Output
r = requests.post(url=url, json={'query': query}, headers=headers)
json_data = json.loads(r.text)
df_data = json_data['data']['user']['pinnedItems']['edges']
data = df_data
i = 0
while i < len(df_data):
    for key, value in df_data[i].items():
        projects = [
            {
                'name': value['name'],
                'url': value['url']
            }
        ]

    i += 1

但是,当我执行此代码并打印出projects 时,只捕获了第一个对象。有谁知道如何将多个对象添加到列表中?我总共有四个对象。

注意:JSON 是基于 GitHub API 的 GraphQL 输出,查询如下:

query {
    user(login:"USER") {
    pinnedItems(first: 4, types: [REPOSITORY]) {
      edges {
        node {
          ... on Repository {
            name
            shortDescriptionHTML
            url
            openGraphImageUrl
          }
        }
      }
    }
  }
}

这是来自 GitHub 的完整 JSON 输出:

{
  "data": {
    "user": {
      "pinnedItems": {
        "edges": [
          {
            "node": {
              "name": "TEXT",
              "shortDescriptionHTML": "TEXT",
              "url": "URL",
              "openGraphImageUrl": "URL"
            }
          },
          {
            "node": {
              "name": "TEXT",
              "shortDescriptionHTML": "TEXT",
              "url": "URL",
              "openGraphImageUrl": "URL"
            }
          },
          {
            "node": {
              "name": "TEXT",
              "shortDescriptionHTML": "TEXT",
              "url": "URL",
              "openGraphImageUrl": "URL"
            }
          },
          {
            "node": {
              "name": "TEXT",
              "shortDescriptionHTML": "TEXT",
              "url": "URL",
              "openGraphImageUrl": "URL"
            }
          }
        ]
      }
    }
  }
}

谢谢

【问题讨论】:

    标签: python graphql


    【解决方案1】:

    您基本上每次都会创建一个包含一个项目的新列表。 要将更多项目附加到同一个列表,您需要使用方法“list.append()”,正如 python_guy_rany 向您展示的那样。

    但是,如果您想继续使用 while 循环,请不要忘记将 i+=1 添加到 python_guy_rany 代码中。 我宁愿使用 for 循环:

    for i in range(len(df_data)):
    

    你可以同时避免 i=0 和 i+=1 。 您也可以使用列表推导式,但我认为坚持使用 for 循环更容易理解。

    【讨论】:

      【解决方案2】:

      改变这个:

      while i < len(df_data):
          for key, value in df_data[i].items():
              projects = [
                  {
                  'name': value['name'],
                  'url': value['url']
                  }
              ]
      

      到这里:

         data = []    
          while i < len(df_data):
              for key, value in df_data[i].items():
                  tmp_data = {'name': value['name'], 'url': value['ur']}
                  data.append(tmp_data)
      

      【讨论】:

        【解决方案3】:

        只捕获第一个对象

        您没有捕获第一个数据。该列表被一个节点一个节点地覆盖。所以你看到的其实是最后一个节点的信息。以不同的方式命名样本数据是一种很好的做法,例如给它们编号,这样更容易排除故障。

        data = df_data有什么用,正在初始化但没有使用。

        df_data = json_data['data']['user']['pinnedItems']['edges']
        data_length = len(df_data)
        i = 0
        projects = []
        while i < data_length:
            for key, value in df_data[i].items():
                node_data = [{'name': value['name'], 'url': value['url']}]
                projects.append(node_data)
            i += 1
        

        输出:

        [[{'name': 'TEXT1', 'url': 'URL'}], [{'name': 'TEXT2', 'url': 'URL'}], [{'name': 'TEXT3', 'url': 'URL'}], [{'name': 'TEXT4', 'url': 'URL'}]]
        

        【讨论】:

          【解决方案4】:

          json_data['data']['user']['pinnedItems']['edges'] 是一个字典列表,因此使用列表解析很容易解析它。

          url = 'https://api.github.com/graphql'
          api_token = 'API_TOKEN'
          headers = {'Authorization': 'token %s' % api_token}
          
          # Parse Output
          r = requests.post(url=url, json={'query': query}, headers=headers)
          json_data = json.loads(r.text)
          df_data = json_data['data']['user']['pinnedItems']['edges']
          
          data = [{'name':x['node']['name'], 'url':x['node']['url']} for x in df_data]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-02-02
            • 1970-01-01
            • 2019-11-07
            • 1970-01-01
            • 1970-01-01
            • 2020-12-06
            • 2013-03-27
            • 2019-03-29
            相关资源
            最近更新 更多