我有一个使用 boto3 使用 DATA-API RDS execute_statement 获得的列和记录列表。由于 api 的响应方式很难以 psycopg2 RealDictCursor 格式获取数据以插入另一个数据库。我想要做的如下图所示。
columns = ["a","b","c"]
records = [[1,2,3],[4,5,6]]
我想将其转换为代表它的字典
[{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6}]
我有一个使用 boto3 使用 DATA-API RDS execute_statement 获得的列和记录列表。由于 api 的响应方式很难以 psycopg2 RealDictCursor 格式获取数据以插入另一个数据库。我想要做的如下图所示。
columns = ["a","b","c"]
records = [[1,2,3],[4,5,6]]
我想将其转换为代表它的字典
[{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6}]
像这样做:
Python 3.8.9 (default, Aug 3 2021, 19:21:54)
[Clang 13.0.0 (clang-1300.0.29.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> columns = ["a","b","c"]
>>> records = [[1,2,3],[4,5,6]]
>>> [dict(zip(columns,rec)) for rec in records]
[{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}]
>>>
这个怎么运作
从外到内工作。 [...]
意味着我们将产生一份清单。 x for rec in records
意味着我们将对x
记录中的每个元素进行一次评估。 zip(columns,rec)
将列名 和 压缩在一起rec
,这将是记录中的一个元素。因此,zip(['a','b','c'],[1,2,3])
生成 list ('a',1), ('b',2), ('c',3)
,这是我们想要构建 dict 的东西。而且,如果您将 2 元组列表传递给字典构造函数,很高兴从中创建字典。 ('a',1)
变成{'a':1,...}
您还可以使用字典理解 + 列表理解(可能比 更直观dict()
):
out = [{col: val for col, val in zip(columns, values)} for values in records]
输出:
[{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}]
您可以更有效地执行以下操作:
result = [dict(zip(columns, record)) for record in records]
这里发生的情况是,我们将遍历记录中的每个内部列表,其中包含 3 项与列一样。然后我们执行zip()
它将两个相等长度的列表转换为类似于称为 的元组列表的东西namedtuple
,例如,[(a, 1), (b, 2), (c, 3)]
对于用列压缩的第一条记录。然后将其转换为字典并存储在结果列表中。这对记录中的每个项目都进行。希望这能让你清楚。
此外,这应该比运行两个 for 循环更有效。通过使用一些高级 python 模块可以进一步优化此操作。