<< >>

diveintopython.org |

Python for experienced programmers

## 1.12. 映射列表

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

例 1.28. 在 `buildConnectionString` 中的列表映射

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

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

例 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]
    [2, 18, 16, 8]
    >>> li
    [1, 9, 8, 4]

| 为了对这一点有一个感性认识，从右向左看它。 `li` 是一个将要映射的列表。Python循环遍历 `li` 一次一个元素，临时将每个元素的值赋给变量 `elem`。然后Python使用函数 ``elem`*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()]
    ['server', 'uid', 'database', 'pwd']
    >>> [params[k] for k in params.keys()]
    ['mpilgrim', 'sa', 'master', 'secret']
    >>> ["%s=%s" % (k, params[k]) for k in params.keys()]
    ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']

| 简单的列表映射举例。映射表达式刚好是元素自身，所以这个列表映射返回列表的原封不动的拷贝。它等于 ``params`.`keys`()`.
| 效难一点的映射。重复遍历 ``params`.`keys`()`，变量 `k` 按顺序赋与每个元素，映射表达式接收元素然后在字典 `params` 中查找相应的值。它等于 ``params`.`values`()`。
| 用一些简单的字符串格式化将前面两个例子合并起来 ，我们就得到一个键-值对列表。这个看上去有点象程序的输出，剩下的就只是将这个列表中的元素接起来形成一个字符串了。

进一步阅读 |

- Python Tutorial 讨论了另一种方法来映射列表 使用内置的 `map` 函数。
- Python Tutorial 展示了如何 对映射嵌套列表。

« 格式化字符串 | 连接列表和分割字符串 »