- Python算法详解
- 张玲玲
- 887字
- 2020-06-27 17:50:50
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']