流畅的 Python(15):序列构成的数组 2.2.3

阅读数:6 2019 年 11 月 20 日 16:56

流畅的Python(15):序列构成的数组 2.2.3

内容简介
本书致力于帮助 Python 开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道 Python 风格的代码。本书尤其深入探讨了 Python 语言的高级用法,涵盖数据结构、Python 风格的对象、并行与并发,以及元编程等不同的方面。

(笛卡儿积)

如前所述,用列表推导可以生成两个或以上的可迭代类型的笛卡儿积。笛卡儿积是一个列表,列表里的元素是由输入的可迭代类型的元素对构成的元组,因此笛卡儿积列表的长度等于输入变量的长度的乘积,如图 2-2 所示。

图 2-2:含有 4 种花色和 3 种牌面的列表的笛卡儿积,结果是一个包含 12 个元素的列表

如果你需要一个列表,列表里是 3 种不同尺寸的 T 恤衫,每个尺寸都有 2 个颜色,示例 2-4 用列表推导算出了这个列表,列表里有 6 种组合。

示例 2-4 使用列表推导计算笛卡儿积

>>> colors = ['black', 'white']
>>> sizes = ['S', 'M', 'L']
>>> tshirts = [(color, size) for color in colors for size in sizes] ➊
>>> tshirts
[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'),
 ('white', 'M'), ('white', 'L')]
>>> for color in colors: ➋
...     for size in sizes:
...         print((color, size))
...
('black', 'S')
('black', 'M')
('black', 'L')
('white', 'S')
('white', 'M')
('white', 'L')
>>> tshirts = [(color, size) for size in sizes    ➌
...                          for color in colors]
>>> tshirts
[('black', 'S'), ('white', 'S'), ('black', 'M'), ('white', 'M'),
 ('black', 'L'), ('white', 'L')]

➊ 这里得到的结果是先以颜色排列,再以尺码排列。

➋ 注意,这里两个循环的嵌套关系和上面列表推导中 for 从句的先后顺序一样。

➌ 如果想依照先尺码后颜色的顺序来排列,只需要调整从句的顺序。我在这里插入了一个换行符,这样顺序安排就更明显了。

在第 1 章的示例 1-1 中,有下面这样一段程序,它的作用是生成一个按花色分组的 52 张牌的列表,其中每个花色各有 13 张不同点数的牌。

self._cards = [Card(rank, suit) for suit in self.suits
                                for rank in self.ranks]

列表推导的作用只有一个:生成列表。如果想生成其他类型的序列,生成器表达式就派上了用场。下一节就是对生成器表达式的一个简单介绍,其中可以看到如何用它生成列表以外的序列类型。

图灵地址 https://www.ituring.com.cn/book/1564

评论

发布