[Python] Comprehensions Concepts
Table of Contents
What is the Comprehension?
這個 Python 必須懂的高階使用概念, 在官方的資料中並沒有單獨 comprehension 的章節, 而是可以看到如下的詞:
- List Comprehension
 - Set Comprehension
 - Dict Comprehension
 - Asynchronous Comprehension (New syntax features in 3.6)
 
而線上的資料大都從 List Comprehension 開始介紹這個概念. Python List Comprehensions: Explained Visually, 這篇由 Tery Hunner 邊寫的內容, 是我看到很多人引用來介紹的文章.
Sometimes a programming design pattern becomes common enough to warrant its own special syntax. Python’s list comprehensions are a prime example of such a syntactic sugar. – Tery Hunner.
而掌握這樣的概念可以帶來什麼好處?
必会的List Comprehension (列表推导式), 來自簡書的這篇文章提到了兩點:
- 應該寫更短和更高效的代碼
 - 代碼應該執行更快
 
所以本文章來記錄如何寫出 Comprehension , 以及紀錄實驗結果.
What is the list comprehension?
List comprehensions are a tool for transforming one list (any iterable actually) into another list. - Tery Hunner.
依據 Tery 的描述, “來源物件”是否支持 iterable 屬性是能否使用 list comprehensions 這個工具的重點. e.g. list, str, tuple, dict 這些都可以利用這工具.
target_object = []
for ITEM in source_object:
    if condition_based_on(ITEM):
        target_object.append("something with" + ITEM)list comprehension: when the type of target is list so we call list comprehension.
target_list = ["something with" + ITEM for ITEM in source_object if condition_based_on(ITEM)]set comprehension
When the type of target is set we call set comprehension.
target_set = {"something with" + ITEM for ITEM in source_object if condition_based_on(ITEM)}dictionary comprehension
When the type of target is dictionary we call dictionary comprehension.
target_dict = { key: value for key, value in source_object.items() }Generator
There is a special case in comprehension progress, the result is the generator type.
target_gen = ("something with" + ITEM for ITEM in source_object if condition_based_on(ITEM))可讀性
target_list = [
    "something with" + ITEM
    for ITEM in source_object
    if condition_based_on(ITEM)
]target_dict = {
    key: value
    for key, value in source_object.items()
    if condition_based_on(value)
}Unconditional Comprehension
for loop type:
doubled_numbers = []
for n in nubmers:
    doubled_numbers.append(n*2)comprehension type
doubled_numbers = [n*2 for n in numbers]readable
doubled_numbers = [
    n*2
    for n in numbers
]Nested Loops
for loop type
flattened = []
for row in matrix:
    for n in row:
        flattened.append(n)comprehension type
flattened = [n for row in matrix for n in row]readable
flattened = [
    n
    for row in matrix
    for n in row
]Reference
The Pythonn Tutorial - Regarding to List Comprehensions