添加列表作为另一个列表的键并转换为字典
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 模块进一步优化此操作。
我有一个列和记录的列表,我使用 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 模块进一步优化此操作。