【问题标题】:Appending to array of dicts only puts last record附加到字典数组只放最后一条记录
【发布时间】:2021-06-02 00:58:39
【问题描述】:

我有以下问题。我正在组装一个dict数组。但是,追加命令只放置最后一条记录。请注意,for 增加变量 i 并在列表中循环。

GITHUB API 请求返回 items 列表中的 100 条记录,因此我通过此列表仅获取我感兴趣的信息,并为每条记录形成一个字典并将该记录添加到列表中。

代码末尾的print() 命令显示了一个数组,其中all 数据等于 items 数组中的最后一个数据。

import requests
import json

def requisicao_api(url):
    resposta = requests.get(url)
    if resposta.status_code == 200:
        return resposta.json()
    else:
        return resposta.status_code

def imprime_repositorios(self):
    dados_api = self.requisicao_api()
    if type(dados_api) is not int:
        for i in range(len(dados_api)):
            print(dados_api[i]['name'])
    else:
        print(dados_api)

urlprincipal = 'https://api.github.com/search/repositories?q=topic:data-science&sort=stars&order=desc&page=1&per_page=100'
dados_api = requisicao_api(urlprincipal)

items = dados_api['items']

def criar_json(nome):
    with open(nome, 'w') as f:
        return f

lista_registros = []

registro = {}

for i in range(len(items)):
    registro[ 'nome' ]    = items[i]['full_name']
    registro[ 'estrelas'] = items[i]['stargazers_count']
    lista_registros.append(registro)

print(lista_registros)

结果:

[{'nome': 'gopherdata/gophernotes', 'estrelas': 2917},
 {'nome': 'gopherdata/gophernotes', 'estrelas': 2917},
 {'nome': 'gopherdata/gophernotes', 'estrelas': 2917},
   ...  100 total
 {'nome': 'gopherdata/gophernotes', 'estrelas': 2917},
 {'nome': 'gopherdata/gophernotes', 'estrelas': 2917}]

【问题讨论】:

  • 请提供预期见MRE - Minimal, Reproducible Example。显示中间结果与预期结果的偏差。我们应该能够将您的代码块粘贴到文件中,运行它并重现您的问题。这也让我们可以在您的上下文中测试任何建议。这段代码不是最小的。您说您的问题只是从另一个列表附加到一个列表,但是您的代码将 JSON、HTTP 请求和其他不相关的开销弄乱了。

标签: python json python-3.x python-requests


【解决方案1】:

您需要像这样在循环内移动字典创建,因为一旦您更改键的值,它将变量本身附加到列表中,它将更新该字典的所有副本,因为它指向同一个字典,因此列表中的所有这些值只会采用您传递给每个字典键的最后一个值的值

for i in range(len(items)):
    registro = {}
    registro[ 'nome' ]    = items[i]['full_name']
    registro[ 'estrelas'] = items[i]['stargazers_count']
    lista_registros.append(registro)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多