在 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, 等级: 良好