0

我有一个使用 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}]
4

3 回答 3

3

像这样做:

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,...}

于 2021-12-21T04:42:50.360 回答
0

您还可以使用字典理解 + 列表理解(可能比 更直观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}]
于 2021-12-21T05:02:52.070 回答
0

您可以更有效地执行以下操作:

result = [dict(zip(columns, record)) for record in records]

这里发生的情况是,我们将遍历记录中的每个内部列表,其中包含 3 项与列一样。然后我们执行zip()它将两个相等长度的列表转换为类似于称为 的元组列表的东西namedtuple,例如,[(a, 1), (b, 2), (c, 3)]对于用列压缩的第一条记录。然后将其转换为字典并存储在结果列表中。这对记录中的每个项目都进行。希望这能让你清楚。

此外,这应该比运行两个 for 循环更有效。通过使用一些高级 python 模块可以进一步优化此操作。

于 2021-12-21T05:11:44.857 回答