使用 Python 列表推导式进行条件过滤的 18 个例子

开发 后端
列表推导式是一种简洁而强大的方式,可以在一行代码中创建列表,并且可以轻松地添加条件过滤。如果你还不熟悉列表推导式,不用担心,我们会从基础开始,一步步介绍更高级的概念。

大家好!今天我们要聊一聊Python中的列表推导式(List Comprehensions)。列表推导式是一种简洁而强大的方式,可以在一行代码中创建列表,并且可以轻松地添加条件过滤。如果你还不熟悉列表推导式,不用担心,我们会从基础开始,一步步介绍更高级的概念。

1.基本列表推导式

首先,我们来看一个最简单的列表推导式,它只是将一个列表中的每个元素乘以2。

# 原始列表
numbers = [1, 2, 3, 4, 5]

# 列表推导式
doubled_numbers = [num * 2 for num in numbers]

print(doubled_numbers)  # 输出: [2, 4, 6, 8, 10]# 原始列表
numbers = [1, 2, 3, 4, 5]

# 列表推导式
doubled_numbers = [num * 2 for num in numbers]

print(doubled_numbers)  # 输出: [2, 4, 6, 8, 10]# 原始列表
numbers = [1, 2, 3, 4, 5]

# 列表推导式
doubled_numbers = [num * 2 for num in numbers]

print(doubled_numbers)  # 输出: [2, 4, 6, 8, 10]

解释:这里,[num * 2 for num in numbers] 是一个列表推导式,它遍历 numbers 列表中的每个元素 num,并将每个 num 乘以2,最终生成一个新的列表 doubled_numbers。

22.添加条件过滤

接下来,我们加上一个条件过滤,只保留偶数。

# 原始列表
numbers = [1, 2, 3, 4, 5]

# 列表推导式加条件过滤
even_numbers = [num for num in numbers if num % 2 == 0]

print(even_numbers)  # 输出: [2, 4]

解释:这里,if num % 2 == 0 是一个条件过滤,只有当 num 是偶数时,才会被包含在新的列表 even_numbers 中。

3.多重条件过滤

我们可以添加多个条件过滤,例如只保留大于2且小于5的数字。

# 原始列表
numbers = [1, 2, 3, 4, 5]

# 列表推导式加多重条件过滤
filtered_numbers = [num for num in numbers if num > 2 and num < 5]

print(filtered_numbers)  # 输出: [3, 4]

解释:这里,if num > 2 and num < 5 是一个多重条件过滤,只有当 num 大于2且小于5时,才会被包含在新的列表 filtered_numbers 中。

4.字符串列表的条件过滤

我们也可以对字符串列表进行条件过滤,例如只保留长度大于3的字符串。

# 原始字符串列表
words = ["apple", "banana", "cherry", "date"]

# 列表推导式加条件过滤
long_words = [word for word in words if len(word) > 3]

print(long_words)  # 输出: ['apple', 'banana', 'cherry']

解释:这里,if len(word) > 3 是一个条件过滤,只有当 word 的长度大于3时,才会被包含在新的列表 long_words 中。

5.嵌套列表推导式

我们可以嵌套多个列表推导式,例如生成一个二维列表,并过滤掉所有0。

# 原始二维列表
matrix = [[1, 0, 3], [4, 0, 6], [7, 8, 0]]

# 嵌套列表推导式加条件过滤
filtered_matrix = [[num for num in row if num != 0] for row in matrix]

print(filtered_matrix)  # 输出: [[1, 3], [4, 6], [7, 8]]

解释:这里,外层的列表推导式遍历 matrix 中的每一行 row,内层的列表推导式遍历 row 中的每个元素 num,并过滤掉所有为0的元素。

6.使用 and 和 or 进行条件过滤

我们可以使用 and 和 or 来组合多个条件,例如只保留大于2或小于4的数字。

# 原始列表
numbers = [1, 2, 3, 4, 5]

# 列表推导式加条件过滤
filtered_numbers = [num for num in numbers if num > 2 or num < 4]

print(filtered_numbers)  # 输出: [1, 2, 3, 5]

解释:这里,if num > 2 or num < 4 是一个条件过滤,只有当 num 大于2或小于4时,才会被包含在新的列表 filtered_numbers 中。

7.使用 not 进行条件过滤

我们可以使用 not 来反转条件,例如只保留不是偶数的数字。

# 原始列表
numbers = [1, 2, 3, 4, 5]

# 列表推导式加条件过滤
odd_numbers = [num for num in numbers if not num % 2 == 0]

print(odd_numbers)  # 输出: [1, 3, 5]

解释:这里,if not num % 2 == 0 是一个条件过滤,只有当 num 不是偶数时,才会被包含在新的列表 odd_numbers 中。

8.使用 in 和 not in 进行条件过滤

我们可以使用 in 和 not in 来检查元素是否存在于某个集合中,例如只保留存在于另一个列表中的数字。

# 原始列表
numbers = [1, 2, 3, 4, 5]
allowed_numbers = [2, 4, 6]

# 列表推导式加条件过滤
filtered_numbers = [num for num in numbers if num in allowed_numbers]

print(filtered_numbers)  # 输出: [2, 4]

解释:这里,if num in allowed_numbers 是一个条件过滤,只有当 num 存在于 allowed_numbers 中时,才会被包含在新的列表 filtered_numbers 中。

9.使用 lambda 函数进行条件过滤

我们可以使用 lambda 函数来定义复杂的条件,例如只保留平方后大于10的数字。

# 原始列表
numbers = [1, 2, 3, 4, 5]

# 列表推导式加条件过滤
filtered_numbers = [num for num in numbers if (lambda x: x ** 2 > 10)(num)]

print(filtered_numbers)  # 输出: [4, 5]

解释:这里,(lambda x: x ** 2 > 10)(num) 是一个 lambda 函数,它计算 num 的平方,并检查是否大于10。只有当 num 的平方大于10时,才会被包含在新的列表 filtered_numbers 中。

10.使用 enumerate

进行条件过滤 我们可以使用 enumerate 函数来获取元素的索引,例如只保留索引为偶数的元素。

# 原始列表
numbers = [1, 2, 3, 4, 5]

# 列表推导式加条件过滤
filtered_numbers = [num for i, num in enumerate(numbers) if i % 2 == 0]

print(filtered_numbers)  # 输出: [1, 3, 5]

解释:这里,for i, num in enumerate(numbers) 使用 enumerate 函数获取每个元素的索引 i 和值 num,if i % 2 == 0 是一个条件过滤,只有当 i 是偶数时,才会被包含在新的列表 filtered_numbers 中。

11.使用 zip 进行条件过滤

我们可以使用 zip 函数来同时遍历多个列表,并进行条件过滤,例如只保留两个列表中对应位置相等的元素。

# 原始列表
list1 = [1, 2, 3, 4, 5]
list2 = [1, 2, 6, 4, 7]

# 列表推导式加条件过滤
filtered_numbers = [a for a, b in zip(list1, list2) if a == b]

print(filtered_numbers)  # 输出: [1, 2, 4]

解释:这里,for a, b in zip(list1, list2) 使用 zip 函数同时遍历 list1 和 list2,if a == b 是一个条件过滤,只有当 a 和 b 相等时,才会被包含在新的列表 filtered_numbers 中。

12.使用 filter 函数进行条件过滤

虽然 filter 函数不是列表推导式的一部分,但我们可以将其与列表推导式结合使用,例如只保留平方后大于10的数字。

# 原始列表
numbers = [1, 2, 3, 4, 5]

# 定义过滤函数
def is_square_greater_than_10(x):
    return x ** 2 > 10

# 列表推导式加条件过滤
filtered_numbers = [num for num in filter(is_square_greater_than_10, numbers)]

print(filtered_numbers)  # 输出: [4, 5]

13.使用 any 和 all 进行条件过滤

我们可以使用 any 和 all 函数来处理更复杂的条件,例如只保留包含至少一个元音字母的单词。

# 原始字符串列表
words = ["apple", "banana", "cherry", "date"]

# 列表推导式加条件过滤
vowel_words = [word for word in words if any(vowel in word for vowel in 'aeiou')]

print(vowel_words)  # 输出: ['apple', 'banana', 'cherry', 'date']

解释:这里,if any(vowel in word for vowel in 'aeiou') 是一个条件过滤,any 函数检查 word 中是否包含任何元音字母。如果 word 中包含至少一个元音字母,那么该单词会被包含在新的列表 vowel_words 中。

14.使用 map 和 filter 结合列表推导式

我们可以将 map 和 filter 函数与列表推导式结合使用,例如将所有数字转换为字符串,并只保留长度大于3的字符串。

# 原始列表
numbers = [1, 2, 3, 4, 5]

# 列表推导式加条件过滤
filtered_strings = [str(num) for num in map(str, numbers) if len(str(num)) > 3]

print(filtered_strings)  # 输出: []

解释:这里,map(str, numbers) 将 numbers 中的每个元素转换为字符串。[str(num) for num in map(str, numbers) if len(str(num)) > 3] 是一个列表推导式,它遍历转换后的字符串列表,并使用 if len(str(num)) > 3 过滤出长度大于3的字符串。在这个例子中,没有长度大于3的字符串,所以输出为空列表。

15.使用 set 进行条件过滤

我们可以使用 set 来去重并进行条件过滤,例如只保留唯一的偶数。

# 原始列表
numbers = [1, 2, 2, 3, 4, 4, 5]

# 列表推导式加条件过滤
unique_even_numbers = [num for num in set(numbers) if num % 2 == 0]

print(unique_even_numbers)  # 输出: [2, 4]

解释:这里,set(numbers) 将 numbers 转换为一个集合,去除了重复的元素。[num for num in set(numbers) if num % 2 == 0] 是一个列表推导式,它遍历去重后的集合,并使用 if num % 2 == 0 过滤出偶数。

16.使用 dict 进行条件过滤

我们可以使用 dict 来过滤字典中的键值对,例如只保留值大于10的键值对。

# 原始字典
data = {'a': 5, 'b': 15, 'c': 10, 'd': 20}

# 列表推导式加条件过滤
filtered_items = [(key, value) for key, value in data.items() if value > 10]

print(filtered_items)  # 输出: [('b', 15), ('d', 20)]

解释:这里,data.items() 返回字典中的键值对。[(key, value) for key, value in data.items() if value > 10] 是一个列表推导式,它遍历字典中的每个键值对,并使用 if value > 10 过滤出值大于10的键值对。

17.使用 try-except 进行条件过滤

我们可以使用 try-except 块来处理可能引发异常的情况,例如只保留可以转换为整数的字符串。

# 原始字符串列表
strings = ["1", "2", "three", "4", "five"]

# 列表推导式加条件过滤
valid_integers = [int(s) for s in strings if s.isdigit()]

print(valid_integers)  # 输出: [1, 2, 4]

解释:这里,if s.isdigit() 检查字符串 s 是否全部由数字组成。如果是,则使用 int(s) 将其转换为整数。[int(s) for s in strings if s.isdigit()] 是一个列表推导式,它遍历 strings 中的每个字符串,并使用 if s.isdigit() 过滤出可以转换为整数的字符串。

18.使用 sorted 进行条件过滤

我们可以使用 sorted 函数对列表进行排序,并结合条件过滤,例如只保留前3个偶数。

# 原始列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 列表推导式加条件过滤
top_three_evens = sorted([num for num in numbers if num % 2 == 0])[:3]

print(top_three_evens)  # 输出: [2, 4, 6]

解释:这里,[num for num in numbers if num % 2 == 0] 是一个列表推导式,它遍历 numbers 中的每个元素,并使用 if num % 2 == 0 过滤出偶数。sorted(...)[:3] 对过滤后的偶数进行排序,并取前3个元素。

实战案例:过滤并统计用户评分

假设我们有一个包含用户评分的列表,我们需要过滤出评分大于等于4的用户,并统计这些用户的数量。

# 原始评分列表
ratings = [3.5, 4.0, 4.5, 3.0, 5.0, 4.2, 3.8, 4.7]

# 列表推导式加条件过滤
high_ratings = [rating for rating in ratings if rating >= 4]

# 统计高评分的数量
high_rating_count = len(high_ratings)

print(f"高评分的数量: {high_rating_count}")
print(f"高评分的用户: {high_ratings}")

解释:

  • ratings 是一个包含用户评分的列表。
  • [rating for rating in ratings if rating >= 4] 是一个列表推导式,它遍历 ratings 中的每个评分,并使用 if rating >= 4 过滤出评分大于等于4的用户。
  • len(high_ratings) 计算高评分的数量。
  • 最后,输出高评分的数量和具体的高评分用户。
责任编辑:赵宁宁 来源: 小白PythonAI编程
相关推荐

2024-11-21 06:00:00

Python列表推导式

2021-03-02 09:35:33

Python循环开发

2024-11-28 07:00:00

Python列表推导式集合推导式

2024-05-20 12:00:00

Python列表推导式

2024-02-21 20:43:02

Python列表推导式

2024-05-20 08:30:00

Python编程

2022-08-14 14:54:10

Pandas字符串数字类型

2023-04-20 13:59:01

Pythonwhile循环的

2023-04-28 07:42:02

2024-12-17 09:00:00

lambda函数Python

2021-03-03 12:55:30

Python列表推导式代码

2024-11-27 06:46:47

Python列表推导式嵌套逻辑

2009-10-13 14:33:00

2024-06-21 15:19:40

2009-06-11 14:48:48

jbpm工作流引擎jbpm例子

2023-12-07 19:33:09

Python推导式

2024-02-22 09:25:09

Python字典推导式开发

2024-04-24 11:27:16

字典推导式Python

2022-10-08 15:32:24

Python开发技巧

2022-10-08 13:29:19

Pandasgroupby
点赞
收藏

51CTO技术栈公众号