第6章- Python 的理解¶
Python语言有两种方法来创建列表和字典,这些方法被称为理解。对于创建Python集,还有第三种理解。在本章中,我们将学习如何使用每种理解。你会发现理解结构建立在你从前几章学到的知识之上,因为它们包含循环和条件本身。
列表推导¶
python中的列表理解非常方便。它们也可能有点难以理解您何时以及为什么要使用它们。列表理解比简单的 for 循环也一样。在继续之前,您可能需要查看循环章节。
如果您准备好了,那么我们将花一些时间来研究如何构造列表理解,并了解如何使用它们。列表理解基本上是一行 for 产生python的循环 list 数据结构。下面是一个简单的例子:
>>> x = [i for i in range(5)]
让我们把这个分解一下。python附带了一个范围函数,可以返回数字列表。默认情况下,它返回从0开始,一直到但不包括传递给它的数字的整数。所以在本例中,它返回一个包含整数0-4的列表。如果您需要很快地创建一个列表,这可能很有用。例如,假设您正在分析一个文件并寻找一些特别的东西。您可以使用列表理解作为一种过滤器:
if [i for i in line if "SOME TERM" in i]:
# do something
我使用类似的代码快速浏览一个文件来解析文件的特定行或部分。当你将函数加入到混合中时,你可以开始做一些非常酷的事情。假设您想对列表中的每个元素应用一个函数,例如当您需要将一组字符串转换为整数时:
>>> x = ['1', '2', '3', '4', '5']
>>> y = [int(i) for i in x]
>>> y
[1, 2, 3, 4, 5]
这种事情发生的频率比你想象的要高。我还必须循环一个字符串列表并调用一个字符串方法,比如在它们上面加上strip,因为它们有各种前导空格或结束空格:
>>> myStrings = [s.strip() for s in myStringList]
有时还需要创建嵌套列表理解。这样做的一个原因是将多个列表展平为一个。此示例来自python文档:
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
文档还显示了嵌套列表理解的其他几个有趣的示例。我强烈建议你看看!现在,您应该能够在自己的代码中使用列表理解,并且能够很好地使用它们。只要运用你的想象力,你就会看到很多你也可以利用它们的好地方。
现在我们准备好继续讨论Python的字典理解了!
词典理解¶
字典的理解始于Python3.0,但后来又回到了Python2.7。它们最初是在 Python Enhancement Proposal 274 (PEP 274) 回到2001年。它们在组织方式上与列表理解非常相似。
理解的最好方法就是做一件!
>>> print( {i: str(i) for i in range(5)} )
{0: '0', 1: '1', 2: '2', 3: '3', 4: '4'}
这是一个非常直接的理解。基本上,它是为范围内的每个项创建一个整数键和字符串值。现在你可能想知道如何在现实生活中使用字典理解。 Mark Pilgrim 提到可以使用字典理解来交换字典的键和值。您可以这样做:
>>> my_dict = {1:"dog", 2:"cat", 3:"hamster"}
>>> print( {value:key for key, value in my_dict.items()} )
{'hamster': 3, 'dog': 1, 'cat': 2}
只有字典值是非可变类型(如字符串)时,此操作才有效。否则,您将导致引发异常。
我还可以看到字典理解对于创建类外变量及其值表很有用。但是,我们现在还没有讨论课程,所以我不会把你和这里的混淆。
集合理解¶
集合理解的创建方式与字典理解的创建方式大致相同。现在,python集与数学集非常相似,因为它没有任何重复的元素。您可以这样创建一个正常集:
>>> my_list = [1, 2, 2, 3, 4, 5, 5, 7, 8]
>>> my_set = set(my_list)
>>> my_set
set([1, 2, 3, 4, 5, 7, 8])
从上面的示例中可以看到,对set的调用已经从列表中删除了重复项。现在,让我们重写此代码以使用集合理解:
>>> my_list = [1, 2, 2, 3, 4, 5, 5, 7, 8]
>>> my_set = {x for x in my_list}
>>> my_set
set([1, 2, 3, 4, 5, 7, 8])
您会注意到,为了创建一个集合理解,我们基本上将列表理解使用的方括号改为字典理解使用的大括号。
总结¶
现在您知道了如何使用各种各样的Python理解。你可能会发现列表理解在一开始是最有用的,也是最流行的。如果你开始运用你的想象力,我相信你将能够找到所有三种理解的用途。现在我们准备好继续学习异常处理了!