5.6 简单推导
列表推导是一种从其他列表创建列表的方式,类似于数学中的集合推导。列表推导的工作原理非常简单,有点类似于for循环。
>>> [x * x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
这个列表由range(10)内每个值的平方组成,非常简单吧?如果只想打印那些能被3整除的平方值,该如何办呢?可使用求模运算符:如果y能被3整除, y 3 % 将返回0(请注意,仅当x能被3整除时, x*x才能被3整除)。为实现这种功能,可在列表推导中添加一条if语句。
>>> [x*x for x in range(10) if x 3 == 0] %
[0, 9, 36, 81]
还可添加更多的for部分。
>>> [(x, y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
作为对比,下面的两个for循环创建同样的列表:
result = []
for x in range(3):
for y in range(3)
result.append((x, y))
与以前一样,使用多个for部分时,也可添加if子句。
>>> girls = ['alice', 'bernice', 'clarice']
>>> boys = ['chris', 'arnold', 'bob']
>>> [b+'+'+g for b in boys for g in girls if b[0] == g[0]]
['chris+clarice', 'arnold+alice', 'bob+bernice']
这些代码将名字的首字母相同的男孩和女孩配对。
更佳的解决方案
前述男孩/女孩配对示例的效率不太高,因为它要检查每种可能的配对。使用Python解决这个问题的方法有很多,下面是Alex Martelli推荐的解决方案:
girls = ['alice', 'bernice', 'clarice']
boys = ['chris', 'arnold', 'bob']
letterGirls = {}
for girl in girls:
letterGirls.setdefault(girl[0], []).append(girl)
print([b+'+'+g for b in boys for g in letterGirls[b[0]]])
这个程序创建一个名为letterGirls的字典,其中每项的键都是一个字母,而值为以这个字母打头的女孩名字组成的列表(字典方法setdefault在前一章介绍过)。创建这个字典后,列表推导遍历所有的男孩,并查找名字首字母与当前男孩相同的所有女孩。这样,这个列表推导就无需尝试所有的男孩和女孩组合并检查他们的名字首字母是否相同了。
使用圆括号代替方括号并不能实现元组推导,而是将创建生成器,详细信息请参阅第9章的旁注“简单生成器”。然而,可使用花括号来执行字典推导。
>>> squares = squared is {}".format(i, i**2) for i in range(10)}
>>> squares[8]
'8 squared is 64'
在列表推导中, for前面只有一个表达式,而在字典推导中, for前面有两个用冒号分隔的表达式。这两个表达式分别为键及其对应的值。
领取专属 10元无门槛券
私享最新 技术干货