3.6. 映射列表

Python 最强大的功能之一是列表推导式,它提供了一种紧凑的方式,通过对列表的每个元素应用函数,将一个列表映射到另一个列表。

示例 3.24. 列表推导式简介

>>> li = [1, 9, 8, 4]
>>> [elem*2 for elem in li]      1
[2, 18, 16, 8]
>>> li                           2
[1, 9, 8, 4]
>>> li = [elem*2 for elem in li] 3
>>> li
[2, 18, 16, 8]
1 为了理解这一点,请从右到左阅读。 li 是您要映射的列表。 Python 一次循环遍历 li 中的一个元素,将每个元素的值临时赋给变量 elem。 然后,Python 应用函数 elem*2 并将结果追加到返回的列表中。
2 请注意,列表推导式不会更改原始列表。
3 将列表推导式的结果赋给您正在映射的变量是安全的。 Python 在内存中构造新列表,并在列表推导式完成后将结果赋给变量。

以下是您在第 2 章中声明的 buildConnectionString 函数中的列表推导式

["%s=%s" % (k, v) for k, v in params.items()]

首先,请注意您正在调用 params 字典的 items 函数。 此函数返回一个元组列表,其中包含字典中的所有数据。

示例 3.25. keysvaluesitems 函数

>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> params.keys()   1
['server', 'uid', 'database', 'pwd']
>>> params.values() 2
['mpilgrim', 'sa', 'master', 'secret']
>>> params.items()  3
[('server', 'mpilgrim'), ('uid', 'sa'), ('database', 'master'), ('pwd', 'secret')]
1 字典的 keys 方法返回所有键的列表。 该列表的顺序与定义字典时的顺序不同(请记住,字典中的元素是无序的),但它是一个列表。
2 values 方法返回所有值的列表。 该列表的顺序与 keys 返回的列表相同,因此对于所有 n 值,params.values()[n] == params[params.keys()[n]]
3 items 方法返回一个元组列表,其形式为 (, )。 该列表包含字典中的所有数据。

现在让我们看看 buildConnectionString 的作用。 它接受一个列表,params.items(),并通过对每个元素应用字符串格式将其映射到一个新列表。 新列表的元素数量与 params.items() 相同,但新列表中的每个元素都是一个字符串,其中包含 params 字典中的键及其关联值。

示例 3.26. buildConnectionString 中的列表推导式,分步说明

>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> params.items()
[('server', 'mpilgrim'), ('uid', 'sa'), ('database', 'master'), ('pwd', 'secret')]
>>> [k for k, v in params.items()]                1
['server', 'uid', 'database', 'pwd']
>>> [v for k, v in params.items()]                2
['mpilgrim', 'sa', 'master', 'secret']
>>> ["%s=%s" % (k, v) for k, v in params.items()] 3
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
1 请注意,您正在使用两个变量来迭代 params.items() 列表。 这是多变量赋值的另一种用法。 params.items() 的第一个元素是 ('server', 'mpilgrim'),因此在列表推导式的第一次迭代中,k 将获取 'server'v 将获取 'mpilgrim'。 在这种情况下,您忽略了 v 的值,并且只在返回的列表中包含 k 的值,因此此列表推导式最终等效于 params.keys()。
2 在这里,您正在做同样的事情,但忽略了 k 的值,因此此列表推导式最终等效于 params.values()。
3 将前两个示例与一些简单的字符串格式化相结合,您将获得一个字符串列表,其中包含字典中每个元素的键和值。 这看起来很像程序的输出。 剩下的就是将此列表中的元素连接成一个字符串。

列表推导式的进一步阅读