一行代码搞定复杂条件表达式判断
一、引言
在 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) # 输出:良好
这里使用了嵌套的条件表达式,实现了多重判断。
四、使用列表推导式进行条件判断
我们还可以利用列表推导式来进行条件判断,特别适合从列表中筛选特定条件的元素。
示例 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]
五、使用字典推导式进行条件判断
类似地,字典推导式可以帮助我们在生成字典时同时进行条件判断。
示例 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': '及格'}
六、使用 lambda 函数进行条件判断
我们还可以使用 lambda 函数 来简化条件判断的逻辑。
示例 5:
定义一个 lambda 函数来判断一个数是否为正数:
is_positive = lambda x: "正数" if x > 0 else "非正数"
print(is_positive(5)) # 输出:正数
print(is_positive(-3)) # 输出:非正数
七、使用 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]
八、使用 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]
九、实战案例:学生信息处理
现在,我们来看一个实际的应用案例:处理学生信息并根据成绩生成等级。
数据准备:
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, 等级: 良好