2.1.5 使用列表推导式

在Python程序中,列表推导式(List Comprehension)是一种简化代码的优美方法。Python官方文档描述道:列表推导式提供了一种创建列表的简洁方法。使用列表推导式能够非常简洁地构造一个新列表,只需要用一个简洁的表达式即可对得到的元素进行转换变形。使用Python列表推导式的语法格式如下所示。

variable = [out_exp_res for out_exp in input_list if out_exp == 2]

· out_exp_res:列表生成元素表达式,可以是有返回值的函数。

· for out_exp in input_list:迭代input_list,将out_exp传入out_exp_res表达式中。

· if out_exp==2:判断根据条件可以过滤哪些值。

例如,想创建一个包含从1到10的平方的列表,在下面的实例文件chuantong.py中,分别演示了传统方法和列表推导式方法的实现过程。

源码路径:daima\第2章\chuantong.py

①squares = []
for x in range(10):
     squares.append(x**2)
②print(squares)
③squares1 = [x**2 for x in range(10)]
print(squares1)

在上述代码中,①~②是通过传统方式实现的,③和之后的代码是通过列表推导式方法实现的。执行后将会输出:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

假如想输出30以内能够整除3的整数,使用传统方法的实现代码如下所示。

numbers = []
for x in range(100):
     if x % 3 == 0:
          numbers.append(x)

而通过列表推导式方法的实现代码如下所示。

multiples = [i for i in range(30) if i % 3 is 0]
print(multiples)

上述两种方式执行后都会输出:

[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

再看下面的代码,首先获取30以内能够整除3的整数,然后依次输出所获得整数的平方。

def squared(x):
     return x*x
multiples = [squared(i) for i in range(30) if i % 3 is 0]
print (multiples)

执行后会输出:

[0, 9, 36, 81, 144, 225, 324, 441, 576, 729]

例如在下面的实例文件shaixuan.py中,使用列表推导式筛选列表中的数据。

源码路径:daima\第2章\2-1\shaixuan.py

mylist = [1, 4, -5, 10, -7, 2, 3, -1]
# 所有正值
zheng = [n for n in mylist if n > 0]
print(zheng)
#所有负值
fu = [n for n in mylist if n < 0]
print(fu)

通过上述代码,分别筛选出列表mylist中大于零和小于零的元素,执行结果如图2-8所示。

图2-8 执行结果

在Python程序中,有时候筛选标准无法简单地表示在列表推导式或生成器表达式中,例如当筛选过程涉及异常处理或者其他一些复杂的细节时。此时可以考虑将处理筛选功能的代码放到单独的功能函数中,然后使用内建的filter()函数进行处理。下面的实例文件dandu.py演示了这一功能。

源码路径:daima\第2章\dandu.py

values = ['1', '2', '-3', '-', '4', 'N/A', '5']
def is_int(val):
 try:
        x = int(val)
        return True
 except ValueError:
        return False
ivals = list(filter(is_int, values))
print(ivals)

在上述代码中,因为使用函数filter()创建了一个迭代器,所以如果想要得到一个列表形式的结果,请确保在filter()前面加上list()函数。执行后会输出:

['1', '2', '-3', '4', '5']