在python中,如何将每个对象的字典从数组中迭代并追加到新数组中(用于序列化数据以在GET请求中返回json)?现有迭代将返回数组中最后一个对象的重复项,如下面的当前结果所示,并且不在下面打印预期的结果。
注意:
我正在使用SQLAlchemy的.get.all()来获取初始消息,但它们不能以JSON序列化,所以我试图远离诸如棉花糖之类的库。瓶.jsonify(response)
和json.dumps(response)
抛出错误。
message = [
{
'id': 1,
'message': the first message,
},
{
'id': 2,
'message': the second message
}
]
response = []
row_data = {}
for message in messages:
for k, v in message.items():
row_data[k] = str(v)
response.append(row_data)
print(response)
当前响应:
[
{
'id': '2',
'message': 'the second message',
},
{
'id': '2',
'message': 'the second message'
}
]
预期的响应:
[
{
'id': '1',
'message': 'the first message',
},
{
'id': '2',
'message': 'the second message'
}
]
这里的问题是您没有断开与row_data
要附加到的字典的连接response
。
因此,在第一次迭代之后,row_data
仍然指向与response
列表中第一个元素相同的字典。然后,您修改存储在字典中的值,并第二次追加。此修改更改了字典,但是由于您对同一个字典有两个引用,因此您认为要获取数据的两个副本,而实际上不是。
此问题类似于“可变默认参数”问题,因为单个收集项在不应使用的情况下被重用。
作为解决方案,我建议在循环内移动初始化程序。每次将创建一个新字典:
for message in messages:
row_data = {}
for k, v in message.items():
row_data[k] = str(v)
response.append(row_data)
更好的解决方案是使用其他机制来创建字典。您要做的只是复制项目,因此请考虑使用dict.copy()
方法或dict()
构建器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句