Comprehension 算是 Python 特有的語法,可以用來宣告一些特定 object,或是對這些 object 做一些操作。
Table of Contents
1. List Comprehension
List comprehension 用來宣告 list object,或是對已存在的 list object 做一些 value 的 update。
[expression for item in iterable (if condition)]
其中的 expression 用來決定 list 中的每個 item 要回傳什麼,if 則是決定要不要回傳這個 item。
1.1 建立 list
如果想要建立一個新的 list,可以用 for loop 搭配 range object 的方式:
for i in range(5):
my_list.append(i * 2)
print(my_list)
[0, 2, 4, 6, 8]
用 list comprehension 的話,可以一行解決,精簡許多:
my_list = [i * 2 for i in range(5)]
print(my_list)
[0, 2, 4, 6, 8]
效能上來說,list comprehension 也比 for loop 快上許多:
import time
s = time.time()
for i in range(int(1e+7)):
my_list.append(i * 2)
print(f'took {round(time.time() - s, 3)} secs')
took 0.489 secs
s = time.time()
my_list = [i * 2 for i in range(int(1e+7))]
print(f'took {round(time.time() - s, 3)} secs')
took 0.355 secs
1.2 map list
如果想要針對 list 的每個 item 執行某些運算後回傳新的 list,除了用 Python built-in function 的 map 之外,也可以用 list comprehension
my_list = [1, 2, 3]
new_list = list(map(lambda i: i * 2 + 5, my_list))
print(new_list)
[7, 9, 11]
my_list = [1, 2, 3]
new_list = [(i * 2) + 5 for i in my_list]
print(new_list)
[7, 9, 11]
1.3 filter list
如果想要用某個 function 來 filter list,除了用 Python built-in function 的 filter 之外,也可以用 list comprehension
my_list = [1, 2, 3, 4, 5]
new_list = list(filter(lambda i: i % 2 == 1, my_list))
print(new_list)
[1, 3, 5]
my_list = [1, 2, 3, 4, 5]
new_list = [i for i in my_list if i % 2 == 1]
print(new_list)
[1, 3, 5]
1.4 map 和 filter list
list comprehension 強大的地方就在於可以同時做到 map 和 filter list:
my_list = [1, 2, 3, 4, 5]
new_list = [i * 5 for i in my_list if i % 2 == 1]
print(new_list)
[5, 15, 25]
2. Set Comprehension
用法和 list comprehension 幾乎一樣,只是回傳的 object 是 set object,而 set object 的特性如下:
- 不會有重複元素
- 沒有順序性
{expression for item in iterable (if condition)}
2.1 建立 set
my_set = {i * 2 for i in range(5)}
print(my_set)
{0, 2, 4, 6, 8}
my_set = {s for s in 'Hello World'}
print(my_set)
{'e', 'H', 'W', 'o', 'r', ' ', 'd', 'l'}
2.2 map set
my_list = [1, 2, 3]
my_set = {(i * 2) + 5 for i in my_list}
print(my_set)
{9, 11, 7}
2.3 filter set
my_list = [1, 2, 3, 4, 5]
my_set = {i for i in my_list if i % 2 == 1}
print(my_set)
{1, 3, 5}
2.4 map 和 filter set
my_list = [1, 2, 3, 4, 5]
my_set = {i * 5 for i in my_list if i % 2 == 1}
print(my_set)
{25, 5, 15}
3. Dict Comprehension
dict comprehension 的用法也類似,但前面的 expression 會變成 key: value 的形式,key 和 value 的部分都可以用 expression 來表達
{key: value for item in iterable (if condition)}
3.1 建立 dict
my_dict = {x: x ** 2 for x in range(5)}
print(my_dict)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
my_dict = {x: x ** 2 for x in range(5) if x % 2 == 1}
print(my_dict)
{1: 1, 3: 9}
my_dict = {x + 3: x ** 2 for x in range(3)}
print(my_dict)
{3: 0, 4: 1, 5: 4}
也可以搭配 enumerate 來建立 dict
延伸閱讀:Python enumerate 用法
programming_languages = ["Python", "Swift", "Java", "C++", "Go", "Rust"]
my_dict = {value: f'index is {index}' for index, value in enumerate(programming_languages)}
print(my_dict)
{
'Python': 'index is 0',
'Swift': 'index is 1',
'Java': 'index is 2',
'C++': 'index is 3',
'Go': 'index is 4',
'Rust': 'index is 5'
}
4. Generator Expression
最後一種是和 comprehension 長得很像,但卻不是 comprehension 的表示法,而是 generator expression。用 generator expression 表示法宣告的 object 是 generator object,可以參考這篇:Python Generator 介紹
參考資料
[Python教學]Python Comprehension語法應用教學
Python 基礎語法教學Part 4 – iT 邦幫忙
Built-in Functions — Python 3.11.5 documentation
Built-in Types — Python 3.11.5 documentation
如果覺得我的文章有幫助的話,歡迎幫我的粉專按讚哦~謝謝你!