diveintopython.org
Python for experienced programmers

1.12. 映射列表

列表映射是一个非常有用的方法,它是通过对列表的每个元素应用一个函数来转换数据。

例 1.28. 在 buildConnectionString 中的列表映射

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

首先,注意到你调用了字典 paramskeys 函数。这个函数简单地返回字典中所有关键字的列表。

例 1.29. Keys 函数

>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> params.keys()
['server', 'uid', 'database', 'pwd']

这个列表没有特别的顺序(记住,元素在字典中是无序的),但因为它是一个列表,这就意味着你可以映射它。映射是通过循环遍历一个列表,并对每个元素应用一个函数,然后返回一个包含为计算后的值的新列表。

例 1.30. 列表映射介绍

>>> li = [1, 9, 8, 4]
>>> [elem*2 for elem in li] 1
[2, 18, 16, 8]
>>> li                      2
[1, 9, 8, 4]
1

为了对这一点有一个感性认识,从右向左看它。 li 是一个将要映射的列表。Python循环遍历 li 一次一个元素,临时将每个元素的值赋给变量 elem。然后Python使用函数 elem*2 ,接着将结果追加到返回列表中。

2 注意列表映射不改变被映射的列表。

现在你应该理解了在 buildConnectionString 中的代码做了什么了。它接收一个列表 params.keys(),然后通过对每个元素应用字符串格式化函数将其映射成一个新列表。新列表将拥有象 params.keys()一样多的元素个数,但是在新列表中的每个元素将包含字典 params 中的键字和它相关的值。

例 1.31. 在 buildConnectionString中的列表映射,step by step

>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> params.keys()
['server', 'uid', 'database', 'pwd']
>>> [k for k in params.keys()]                        1
['server', 'uid', 'database', 'pwd']
>>> [params[k] for k in params.keys()]                2
['mpilgrim', 'sa', 'master', 'secret']
>>> ["%s=%s" % (k, params[k]) for k in params.keys()] 3
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
1

简单的列表映射举例。映射表达式刚好是元素自身,所以这个列表映射返回列表的原封不动的拷贝。它等于 params.keys().

2

效难一点的映射。重复遍历 params.keys(),变量 k 按顺序赋与每个元素,映射表达式接收元素然后在字典 params 中查找相应的值。它等于 params.values()

3

用一些简单的字符串格式化将前面两个例子合并起来 ,我们就得到一个键-值对列表。这个看上去有点象程序的输出,剩下的就只是将这个列表中的元素接起来形成一个字符串了。


进一步阅读