添加列表作为另一个列表的键并转换为字典

Add list as keys for another list and convert to dictionary

我有一个列和记录的列表,我使用 DATA-API RDS execute_statement 使用 boto3 获得这些列和记录。作为 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]) 生成列表 ('a',1), ('b',2), ('c',3),这是我们要从中构建字典的内容。而且,如果您将 2 元组列表传递给字典构造函数,它很乐意从中创建字典。 ('a',1) 变为 {'a':1,...}

您可以按以下方式更有效地完成:

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

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

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