一行代碼搞定復雜條件表達式判斷
在 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, 等級: 良好