Python Comprehension

Python Comprehension 語法 – List Comprehension, Set Comprehension, Dict Comprehension

Comprehension 算是 Python 特有的語法,可以用來宣告一些特定 object,或是對這些 object 做一些操作。

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

如果覺得我的文章有幫助的話,歡迎幫我的粉專按讚哦~謝謝你!

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top