将具有相同键的字典添加到列表中而不覆盖 Python 中的值

时间:2021-01-12 14:30:24

标签: python list dictionary

我有以下问题:在输入参数列表的循环中,我为每个列表条目调用 API。然后我想将结果写入 dict 并将该 dict 附加到输出列表中。在循环结束时,我想打印该输出列表。发生的情况是每次我追加到输出列表时,最后一个 API 调用/输入参数列表中的最后一个元素都会被覆盖。

import requests

input_parameters = ['A', 'B', 'C', 'D']

output = []
record = {}

for input in input_parameters:
    r=requests.get("https://api.domain.com/v2/param=" + str(input))

    record['id'] = str(r.json()['data'][0]['id'])
    record['descr'] = str(r.json()['data'][0]['descr'])
    record['qty'] = str(r.json()['data'][0]['qty'])

    output.append(record)

print(output)

我得到的输出:

[{'id': 'D', 'descr': 'foobar', 'qty': '10'}, {'id': 'D', 'descr': 'foobar', 'qty': '10'}, {'id': 'D', 'descr': 'foobar', 'qty': '10'}, {'id': 'D', 'descr': 'foobar', 'qty': '10'}]

我想要的输出:

[{'id': 'A', 'descr': 'barfoo', 'qty': '50'}, {'id': 'B', 'descr': 'bar or foo', 'qty': '80'}, {'id': 'C', 'descr': 'foo foo bar', 'qty': '25'}, {'id': 'D', 'descr': 'foobar', 'qty': '10'}]

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

output.append(record) 不复制 record。所以,当你这样做时,比如说,record['id'] = str(r.json()['data'][0]['id'])原始,只有一个 record 将被修改。

由于只有一个 record 对象,因此连续调用 output.append(record) 将使用对同一字典对象的引用填充 output

您可以改为每次都创建一个新字典:

record = {
    'id': str(r.json()['data'][0]['id']),
    'descr': str(r.json()['data'][0]['descr'])
    'qty': str(r.json()['data'][0]['qty'])
}

或者用 output.append(record.copy()) 复制字典。在任何情况下,您都需要为 input_parameters 的每个元素创建一个新的字典对象。