一行代码搞定复杂条件表达式判断

开发
通常我们会使用 if 语句来实现逻辑判断,但有时候,简单的 if 语句可能显得冗长且不够优雅。今天,我们就来聊聊如何用一行代码搞定复杂的条件表达式判断。

在 Python 编程中,条件判断是必不可少的一部分。通常我们会使用 if 语句来实现逻辑判断。但有时候,简单的 if 语句可能显得冗长且不够优雅。今天,我们就来聊聊如何用一行代码搞定复杂的条件表达式判断。

基本的条件表达式

首先,让我们回顾一下基本的条件表达式——三元运算符。在 Python 中,我们可以用下面的形式来表示:

result = value_if_true if condition else value_if_false

这段代码的意思是:如果 condition 条件为真,则 result 的值为 value_if_true;否则为 value_if_false。

示例 1:

假设我们要根据一个人的年龄来判断他是否成年:

age = 20
is_adult = "成年人" if age >= 18 else "未成年人"
print(is_adult)  # 输出:成年人

嵌套条件表达式

有时候,我们的需求不仅仅是简单的二选一,而是需要多重条件判断。这时,我们可以将多个条件表达式嵌套起来使用。

示例 2:

假设我们要根据一个人的成绩来评定他的等级:

score = 85
grade = "优秀" if score >= 90 else ("良好" if score >= 80 else "及格")
print(grade)  # 输出:良好

这里,我们使用了两层嵌套的条件表达式。如果 score 大于等于 90,则 grade 为 “优秀”;否则再判断 score 是否大于等于 80,如果是,则 grade 为 “良好”,否则为 “及格”。

使用列表推导式进行条件判断

除了条件表达式外,我们还可以利用列表推导式来进行更复杂的条件判断。

示例 3:

假设我们要从一个列表中筛选出所有偶数:

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = [num for num in numbers if num % 2 == 0]
print(even_numbers)  # 输出:[2, 4, 6]

这里,我们使用列表推导式来遍历 numbers 列表,并通过条件 num % 2 == 0 来筛选出所有偶数。

使用字典推导式进行条件判断

类似地,我们也可以使用字典推导式来进行条件判断。

示例 4:

假设我们要根据学生的成绩来生成一个包含等级的字典:

students = {"Alice": 85, "Bob": 92, "Charlie": 78}
grades = {name: "优秀" if score >= 90 else ("良好" if score >= 80 else "及格") for name, score in students.items()}
print(grades)  # 输出:{'Alice': '良好', 'Bob': '优秀', 'Charlie': '及格'}

这里,我们使用字典推导式来遍历 students 字典,并通过条件表达式来生成一个新的字典 grades。

使用 lambda 函数进行条件判断

除了列表推导式和字典推导式,我们还可以使用 lambda 函数来简化条件判断。

示例 5:

假设我们需要一个函数来判断一个数是否为正数,并返回相应的信息:

is_positive = lambda x: "正数" if x > 0 else "非正数"
print(is_positive(5))  # 输出:正数
print(is_positive(-3))  # 输出:非正数

这里,我们定义了一个 lambda 函数 is_positive,它接受一个参数 x 并返回相应的判断结果。

使用 map() 和 filter() 进行条件判断

对于更复杂的条件判断,我们可以结合使用 map() 和 filter() 函数。

示例 6:

假设我们要从一个列表中筛选出所有正数,并计算它们的平方:

numbers = [-5, 3, 7, -2, 8, 0]
positive_squares = list(map(lambda x: x ** 2, filter(lambda x: x > 0, numbers)))
print(positive_squares)  # 输出:[9, 49, 64]

这里,我们先使用 filter() 函数筛选出所有的正数,然后使用 map() 函数计算它们的平方。

使用 itertools.compress() 进行条件判断

对于更复杂的条件组合,可以使用 itertools.compress() 函数来实现。

示例 7:

假设我们要从一个列表中筛选出所有奇数,并计算它们的立方:

import itertools

numbers = [-5, 3, 7, -2, 8, 0]
selectors = [True if num % 2 != 0 else False for num in numbers]
odd_cubes = list(itertools.compress([num ** 3 for num in numbers], selectors))
print(odd_cubes)  # 输出:[-125, 27, 343]

这里,我们首先生成一个选择器列表 selectors,用于判断哪些数是奇数。然后使用 itertools.compress() 函数来筛选出奇数,并计算它们的立方。

实战案例:学生信息处理

现在,我们来看一个实际的应用案例:处理学生信息并根据成绩生成等级。

假设我们有一个学生信息列表,每个学生的信息包括姓名、成绩和班级。我们需要根据成绩生成学生的等级,并按班级进行分组。

数据准备:

students = [
    {"name": "Alice", "score": 85, "class": "A"},
    {"name": "Bob", "score": 92, "class": "B"},
    {"name": "Charlie", "score": 78, "class": "A"},
    {"name": "David", "score": 88, "class": "B"},
    {"name": "Eva", "score": 91, "class": "A"}
]

解决方案:

# 定义一个函数来生成等级
def get_grade(score):
    return "优秀" if score >= 90 else ("良好" if score >= 80 else "及格")

# 使用列表推导式生成新的学生信息列表,包含等级
students_with_grades = [
    {**student, "grade": get_grade(student["score"])} for student in students
]

# 按班级分组
from collections import defaultdict

grouped_students = defaultdict(list)
for student in students_with_grades:
    grouped_students[student["class"]].append(student)

# 打印结果
for class_name, class_students in grouped_students.items():
    print(f"班级 {class_name}:")
    for student in class_students:
        print(f"  姓名: {student['name']}, 成绩: {student['score']}, 等级: {student['grade']}")

输出结果:

班级 A:
  姓名: Alice, 成绩: 85, 等级: 良好
  姓名: Charlie, 成绩: 78, 等级: 及格
  姓名: Eva, 成绩: 91, 等级: 优秀
班级 B:
  姓名: Bob, 成绩: 92, 等级: 优秀
  姓名: David, 成绩: 88, 等级: 良好
责任编辑:赵宁宁 来源: PythonAI与图像处理
相关推荐

2010-03-12 17:44:21

Python正则表达式

2021-02-24 14:30:59

JavaScript语言开发

2024-05-31 14:04:18

2024-04-30 08:05:15

Rust代码计算

2023-09-06 09:40:29

2022-02-24 10:40:14

Python代码

2023-11-10 09:41:44

Python代码

2009-07-06 15:20:30

JSP表达式

2024-03-01 08:51:01

Django查询表达式查询语句

2016-12-02 08:53:18

Python一行代码

2014-01-05 17:41:09

PostgreSQL表达式

2023-11-30 08:21:33

2024-01-05 17:41:36

Rust编程循环

2009-09-16 18:03:05

Java正则表达式正则表达式实现

2021-10-29 10:38:20

代码 PILPython

2016-12-19 10:22:05

代码正则表达式

2009-11-17 10:20:37

PHP正则表达式

2019-03-13 08:56:07

JavaSpEL表达式注入

2009-03-23 10:47:43

数据库SQLLINQ

2024-06-03 00:00:01

表达式PythonJava
点赞
收藏

51CTO技术栈公众号