Python进阶语法之列表推导式
Python列表推导式是Python中最有魅力的特性之一,它提供了一种优雅、简洁的方式来创建列表。这种语法不仅使得代码更加简洁,易读,而且在某些情况下还可以提高代码的执行效率。接下来,我们将一起深入探索Python列表推导式的魔力。
列表推导式基础
列表推导式(list comprehension)是一种创建列表的语法糖。基本形式如下:
[expression for item in iterable]
这个语句将iterable中的每个item代入expression得到新的元素,然后把这些元素组成一个新的列表。
例如,我们可以用它来创建一个由1到10的平方构成的列表:
squares = [x**2 for x in range(1, 11)] print(squares) # 输出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
添加条件过滤
我们还可以在列表推导式中添加条件过滤元素。语法如下:
[expression for item in iterable if condition]
这个语句将满足condition
的item
代入expression
得到新的元素,然后把这些元素组成一个新的列表。
例如,我们可以创建一个由1到10的所有奇数的平方构成的列表:
odd_squares = [x**2 for x in range(1, 11) if x % 2 == 1] print(odd_squares) # 输出: [1, 9, 25, 49, 81]
嵌套的列表推导式
列表推导式可以嵌套,形式如下:
[expression for item1 in iterable1 for item2 in iterable2]
这将对iterable1
和iterable2
中的所有元素组合执行expression
。
例如,我们可以创建一个两个列表的所有元素的配对列表:
pairs = [(x, y) for x in [1, 2, 3] for y in ['a', 'b', 'c']] print(pairs) # 输出: [(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]
列表推导式与性能
列表推导式不仅让代码更易读,更简洁,有时候还能提高代码性能。因为列表推导式是在Python的C实现层级完成的,所以它比等效的for循环快。
例如,考虑以下两种方式创建一个0到9999的平方列表:
# 方法一:for循环 squares1 = [] for x in range(10000): squares1.append(x**2) #方法二:列表推导式 squares2 = [x**2 for x in range(10000)]
在大多数环境下,方法二(列表推导式)的运行速度都会比方法一(for循环)快,因为列表推导式的执行是在Python的底层C语言中完成的,减少了Python层面的解释器开销。 但是,请注意,列表推导式也不是万能的。在处理大数据集或者进行复杂计算时,还应该考虑其他工具,例如NumPy和Pandas等。 ## 列表推导式与可读性 虽然列表推导式在许多情况下可以提高代码的可读性,但这并不意味着任何情况下都应该使用它。如果一个列表推导式过于复杂,它可能会使代码更难理解。在这种情况下,使用传统的for循环可能会更好。
以下是一个复杂的列表推导式例子:
result = [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
这个列表推导式生成了两个范围内的所有偶数和奇数的配对,但是理解这段代码需要一些时间。相比之下,下面的for循环版本的代码可能更容易理解:
result = [] for x in range(5): if x % 2 == 0: for y in range(5): if y % 2 == 1: result.append((x, y))
案例
- 将列表中的每个元素都平方
lst = [1, 2, 3, 4, 5] squared_lst = [x**2 for x in lst] print(squared_lst) # 输出 [1, 4, 9, 16, 25]
- 过滤掉列表中的偶数
lst = [1, 2, 3, 4, 5] odd_lst = [x for x in lst if x % 2 != 0] print(odd_lst) # 输出 [1, 3, 5]
3.从两个列表中取出所有可能的组合
lst1 = ['a', 'b'] lst2 = [1, 2] combinations = [(x, y) for x in lst1 for y in lst2] print(combinations) # 输出 [('a', 1), ('a', 2), ('b', 1), ('b', 2)]
4.将嵌套的列表展开为一个平面的列表
nested_lst = [[1, 2], [3, 4], [5, 6]] flat_lst = [num for inner_lst in nested_lst for num in inner_lst] print(flat_lst) # 输出 [1, 2, 3, 4, 5, 6]
- 计算字符串列表中每个字符串的长度
lst = ['hello', 'world', 'python'] lengths = [len(x) for x in lst] print(lengths) # 输出 [5, 5, 6]
总的来说,列表推导式是Python的一个强大工具,它可以帮助我们写出更优雅、更简洁的代码,同时还有可能提高代码的性能。但在使用列表推导式时,我们也应该关注代码的可读性,避免写出过于复杂的列表推导式。当推导式过于复杂时,不妨回退使用传统的for循环。