一行代碼搞定復(fù)雜條件表達式判斷
在 Python 編程中,條件判斷是必不可少的一部分。通常我們會使用 if 語句來實現(xiàn)邏輯判斷。但有時候,簡單的 if 語句可能顯得冗長且不夠優(yōu)雅。今天,我們就來聊聊如何用一行代碼搞定復(fù)雜的條件表達式判斷。
基本的條件表達式
首先,讓我們回顧一下基本的條件表達式——三元運算符。在 Python 中,我們可以用下面的形式來表示:
result = value_if_true if condition else value_if_false
這段代碼的意思是:如果 condition 條件為真,則 result 的值為 value_if_true;否則為 value_if_false。
示例 1:
假設(shè)我們要根據(jù)一個人的年齡來判斷他是否成年:
age = 20
is_adult = "成年人" if age >= 18 else "未成年人"
print(is_adult) # 輸出:成年人
嵌套條件表達式
有時候,我們的需求不僅僅是簡單的二選一,而是需要多重條件判斷。這時,我們可以將多個條件表達式嵌套起來使用。
示例 2:
假設(shè)我們要根據(jù)一個人的成績來評定他的等級:
score = 85
grade = "優(yōu)秀" if score >= 90 else ("良好" if score >= 80 else "及格")
print(grade) # 輸出:良好
這里,我們使用了兩層嵌套的條件表達式。如果 score 大于等于 90,則 grade 為 “優(yōu)秀”;否則再判斷 score 是否大于等于 80,如果是,則 grade 為 “良好”,否則為 “及格”。
使用列表推導式進行條件判斷
除了條件表達式外,我們還可以利用列表推導式來進行更復(fù)雜的條件判斷。
示例 3:
假設(shè)我們要從一個列表中篩選出所有偶數(shù):
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 來篩選出所有偶數(shù)。
使用字典推導式進行條件判斷
類似地,我們也可以使用字典推導式來進行條件判斷。
示例 4:
假設(shè)我們要根據(jù)學生的成績來生成一個包含等級的字典:
students = {"Alice": 85, "Bob": 92, "Charlie": 78}
grades = {name: "優(yōu)秀" if score >= 90 else ("良好" if score >= 80 else "及格") for name, score in students.items()}
print(grades) # 輸出:{'Alice': '良好', 'Bob': '優(yōu)秀', 'Charlie': '及格'}
這里,我們使用字典推導式來遍歷 students 字典,并通過條件表達式來生成一個新的字典 grades。
使用 lambda 函數(shù)進行條件判斷
除了列表推導式和字典推導式,我們還可以使用 lambda 函數(shù)來簡化條件判斷。
示例 5:
假設(shè)我們需要一個函數(shù)來判斷一個數(shù)是否為正數(shù),并返回相應(yīng)的信息:
is_positive = lambda x: "正數(shù)" if x > 0 else "非正數(shù)"
print(is_positive(5)) # 輸出:正數(shù)
print(is_positive(-3)) # 輸出:非正數(shù)
這里,我們定義了一個 lambda 函數(shù) is_positive,它接受一個參數(shù) x 并返回相應(yīng)的判斷結(jié)果。
使用 map() 和 filter() 進行條件判斷
對于更復(fù)雜的條件判斷,我們可以結(jié)合使用 map() 和 filter() 函數(shù)。
示例 6:
假設(shè)我們要從一個列表中篩選出所有正數(shù),并計算它們的平方:
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() 函數(shù)篩選出所有的正數(shù),然后使用 map() 函數(shù)計算它們的平方。
使用 itertools.compress() 進行條件判斷
對于更復(fù)雜的條件組合,可以使用 itertools.compress() 函數(shù)來實現(xiàn)。
示例 7:
假設(shè)我們要從一個列表中篩選出所有奇數(shù),并計算它們的立方:
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,用于判斷哪些數(shù)是奇數(shù)。然后使用 itertools.compress() 函數(shù)來篩選出奇數(shù),并計算它們的立方。
實戰(zhàn)案例:學生信息處理
現(xiàn)在,我們來看一個實際的應(yīng)用案例:處理學生信息并根據(jù)成績生成等級。
假設(shè)我們有一個學生信息列表,每個學生的信息包括姓名、成績和班級。我們需要根據(jù)成績生成學生的等級,并按班級進行分組。
數(shù)據(jù)準備:
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"}
]
解決方案:
# 定義一個函數(shù)來生成等級
def get_grade(score):
return "優(yōu)秀" 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)
# 打印結(jié)果
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']}")
輸出結(jié)果:
班級 A:
姓名: Alice, 成績: 85, 等級: 良好
姓名: Charlie, 成績: 78, 等級: 及格
姓名: Eva, 成績: 91, 等級: 優(yōu)秀
班級 B:
姓名: Bob, 成績: 92, 等級: 優(yōu)秀
姓名: David, 成績: 88, 等級: 良好