1. Python列表推导式制介绍
Python 列表推导式(List comprehension) 是一种可以用一种简洁的方式创建列表的方式,比使用循环创建列表更加高效便捷。列表推导式的语法格式是:[expression for item in iterable],其中 expression 是这个新列表的计算方式, item 是 iterable 中的每个元素,最终结果是将 expression 应用到迭代器中的每个元素。除此之外,列表推导式还有两个可选的部分,一个是筛选条件(filter),另一个是多重循环。筛选条件使列表推导式能够更进一步地控制这些元素如何包含在列表中,而多重循环则允许我们对多个可迭代对象执行列表推导。
将列表推导式应用到解决生活中的问题上,例如:我们想要创建一个新的列表,它仅包含另一个列表里的所有偶数。我们可以使用列表推导式来实现它,示例代码如下所示:
original_lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
new_lst = [x for x in original_lst if x % 2 == 0]
print(new_lst) # [2, 4, 6, 8, 10]
通过这个例子实现了一个简单、省事的方式来创建新列表,而不需要使用一个循环语句。此外,这种方法还提供了一个简单的条件判断功能。
2. 基本列表推导式语法格式
Python 列表推导式通常有以下的基本语法格式:
new_lst = [expression for item in iterable]
其中,square brackets ([])中的表达式(expression)是新列表的计算方式, item 是可迭代对象(iterable)中的每个元素,最终结果是将 expression 应用到迭代器中的每个元素。除此之外,列表推导式还有两个可选的部分,一个是筛选条件(filter),另一个是多重循环。筛选条件使列表推导式能够更进一步地控制这些元素如何包含在列表中,而多重循环则允许我们对多个可迭代对象执行列表推导。
2.1 基础示例
以下是一个基础的示例:将一组值的平方添加到一个新列表中。
numbers = [1, 2, 3, 4, 5]
squares = [number ** 2 for number in numbers]
print(squares) # Output: [1, 4, 9, 16, 25]
在这个例子中,我们通过列表推导式在一个新列表中创建了平方数列表。循环语句迭代了 numbers 列表中的每个元素,并对其进行平方,最终将新的列表共享出来。
2.2 带有 if 筛选器的基础示例
带有 if语句 的 基础示例:在一个列表推导式中,我们可以添加一个if语句来额外筛选原列表中的元素。
numbers = [1, 2, 3, 4, 5]
evens = [number for number in numbers if number % 2 == 0]
print(evens) # Output: [2, 4]
在这个示例中,我们使用条件 number % 2 == 0 将列表 numbers 中的所有偶数筛选出来并放入一个新列表中。
2.3 多层循环示例
多层循环示例在单个列表推导式中实现嵌套循环。例如,我们可以使用两个 for 循环对两个不同的列表中的每个元素进行迭代。
colors = ['red', 'green', 'blue']
tags = ['h1', 'h2', 'h3']
styles = [f'<{tag}>{color}{tag}>' for color in colors for tag in tags]
print(styles)
在这个示例中,我们使用两个不同的迭代循环来生成html标签。最终的结果是一个包含每个颜色和标签标记对的列表。
3. 列表推导式带有多个 for 循环
除了包含筛选条件的简单列表推导式和多重循环列表推导式,我们还可以使用多个 for 循环来生成新列表。对于多层循环的列表推导式,语法设计得相当直接:
new_list = [expression for item_one in iterable_one for item_two in iterable_two]
在这个语法中,square brackets ([])内部的表达式(expression)是新列表的计算方式,iterable_one 和 iterable_two 是两个可迭代对象。通过两个for循环迭代 iterable_one 和 iterable_two 中的元素, 并将对每个元素执行expression中的操作后输出结果到一个新列表。
4. 后置 if语句
除了列表推导式中的普通 if语句外,Python 还允许使用 后置 if 语句 来筛选元素发到新列表中。这个语法是一个标准的 if 语句,只附加到列表推导式的末尾。
new_lst = [expression if condition else other for item in iterable]
在这里,表达式(expression)是新列表的计算方式,条件(condition)是过滤原列表时要执行的筛选条件,other是可选项,如果表达式语句为 false,则other是辅助排除元素的。至于原列表中的单个元素,则将提供给 item 变量然后进行操作。如果条件是 true,则将结果添加到新列表中。否则,将忽略该元素,继续下一个。
5. 使用多个列表推导式
有时候,一次过性的使用列表推导式,是不能解决所有问题的,我们可以使用多个列表推导式将其组合。在一些复杂的示例中,这是特别有用的,在这种情况下,一个列表推导式可能会变得难以理解或包含错误。
以下是一个使用多重列表推导式来生成(3, 4, 5)三元组的示例:
values = [1, 2, 3, 4, 5, 6, 7, 8, 9]
triples = [(x, y, z) for x in values for y in values for z in values if x + y + z == 12]
print(triples)
在此示例中,我们使用了三层 for 循环和一个 if 语句,以生成符合特定条件(如x = y + 1,y = z + 1)的三元组。其结果将会输出为一个元素为元组的列表。
6. 总结
Python 列表推导是列表生成式的简化版的语法。它能够根据现有列表快速生成一个新的列表,而不是在原有列表进行修改,因此不会改变原列表中的值,并且列表推导式功能强大,可以通过嵌套 for 循环,筛选条件和多个表达式等查询生成自己需要的列表。通过多个列表推导式的组合,我们可以轻松生成复杂条件下的列表类型,而且语法简洁易读。