将Python字典追加到列表

时间:2020-06-24 01:25:35

标签: python graphql

我试图将GraphQL查询的输出迭代为JSON,并创建一个包含信息的Python字典列表(“ projects”变量)。这是到目前为止我一直在使用的代码:

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"
            }
          }
        ]
      }
    }
  }
}

谢谢

4 个答案:

答案 0 :(得分:2)

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

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

for i in range(len(df_data)):

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

答案 1 :(得分:1)

更改此:

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)

答案 2 :(得分:1)

仅捕获第一个对象

您没有捕获第一个数据。节点后,该列表正在被覆盖。因此,您实际上看到的是最后一个节点的信息。优良作法是使用不同的名称命名示例数据,例如对它们进行编号,以便更轻松地排除故障。

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'}]]

答案 3 :(得分:1)

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]