列表推導式（list comprehension），是程式設計語言的一類語法結構，用於基於描述建立一個列表（list）資料結構。相當於數學上的集合建構式符號。但不同於 map 與 filter 函式。 list comprehension 沒有統一的中文譯法。有譯作列表解析式、列表生成式、列表構建、列表理解等。 概述 考慮下述集合建構式符號： S2cdot xmid x in mathbb N x23 可讀作：S 是所有 2 乘 x 的數的集合，滿足 x 是自然數 mathbb N，並且 x 的平方大於 3。 Sunderbrace 2cdot x_color Violettext 輸 出 表 達 式mid underbrace x_color Violettext 變 量 in underbrace mathbb N_color Violettext 輸 入 集 合 underbrace x23_color Violettext 謂 詞 x 是表示輸入集合的成員的變數。 mathbb N 表示輸入集合，這裡是自然數。 x23 是謂詞表示式，用於從輸入集篩選。 2cdot x 是輸出表達式，用於產生新的集合。 花括號表示輸出值組成集合。 mid 豎槓讀作 滿足，可以同冒號 互換使用。 逗號分隔謂詞，可以讀作 並且。 列表推導式，與從一個輸入列表或迭代器，依次生成一個列表的表示，有相同的語法構件： 代表輸入列表的成員的一個變數。 一個輸入列表（或迭代器）。 一個可選的謂詞（判斷）表示式。 和從滿足這個判斷的，輸入可迭代者的成員，產生輸出列表的成員的一個表示式。 在 Haskell 的列表推導式語法中，上述集合建造結構類似的寫為如下： s 2x x 0 x2 3 這裡的列表 0 表示 mathbb N，x2 3 表示謂詞，而 2x 表示輸出表達式。列表推導式，按一個確定次序，給出結果（不同於集合的成員）；並且列表推導式，可以依次生成一個列表的成員，而非生成這個列表的全體，從而允許前面的對一個無窮列表的成員的 Haskell 定義。 歷史 在術語 列表推導式 使用之前，就存在了有關的構造。集合論程式語言 SETL（1969 年），有類似列表推導式的一種形成構造。比如，這個程式碼列印從 2 到 N 的所有素數： print n in 2N forall m in 2n 1 n mod m 0 計算機代數系統（1973 年），有處理串流的類似構造。 首次對這種構造的使用術語 推導式，是在 1977 年以後，和 John Darlington，用在他們的函數語言程式設計語言 NPL 的描述之中。在的回憶錄《函數語言程式設計語言的一些歷史》中，他回想起： NPL 由 Burstall 用 POP2 實現，並被 Darlington 用於程式變換的工作（Burstall Darlington 1977）。這個語言，是一階、強型別（但不多型）、純函式式、傳值呼叫的。它還有 集合表示式 比如： setofeven X x x in X even x 在給術語 列表推導式 附加的腳註中，Turner 還記述了： 我最初稱其為 ZF 表示式，參照了 ZermeloFrankel 集合論，Phil Wadler 鑄就了更好的術語 列表推導式。 Burstall 和 Darlington 關於 NPL 的工作，在 1980 年代影響了很多函數語言程式設計語言，但並非全部都包括了列表推導式。其中最有影響的，是 1985 年發行的，Turner 的惰性純函數語言程式設計語言 Miranda。後來開發的標準惰性純函式式語言 Haskell，包含了 Miranda 的很多特徵，包括列表推導式。 Python 示例 Python 語言的列表推導式和生成器表示式的語法示例： s 2x for x in range 10 if x2 3 print s 4 6 8 10 12 14 16 18 from itertools import count islice s 2x for x in count 0 if x2 3 t islice s 10 print t 4 6 8 10 12 14 16 18 20 22 print t t islice s10 print t 24 26 28 30 32 34 36 38 40 42 推廣 並行列表推導式 格拉斯哥 Haskell 編譯器，擁有一個擴充套件叫作 並行列表推導式（也叫做拉鍊推導式），它允許在列表推導式語法中，有多個獨立分支的限定符 。用逗號，分隔的限定符，是依賴的（巢狀的）；而用管道符號 分隔的限定符，是並行求值的（這不涉及任何形式的多執行緒性，這隻意味著這些分支是被合併的）。 常規列表推導式 a xy x 15 y 68 161718262728363738464748565758 拉鍊列表推導式 b xy xy zip 15 68 162736 並行列表推導式 c xy x 15 y 68 162738 Python 語言的語法示例： 常規列表推導式 x y for x in range 1 6 for y in range 6 9 1 6 1 7 1 8 2 6 2 7 2 8 3 6 3 7 3 8 4 6 4 7 4 8 5 6 5 7 5 8 並行 拉鍊列表推導式 s zip range 1 6 range 6 9 t x for x in s print t 1 6 2 7 3 8 from operator import add map add range 1 6 range 6 9 有二個實際引數列表的 map 相當於 Haskell 的 zipWith 7 9 11 from itertools import starmap zip_longest starmap add t 7 9 11 s zip_longest range 1 6 range 6 9 t s print t 1 6 2 7 3 8 4 None 5 None zip t 1 2 3 4 5 6 7 8 None None 單子推導式 在 Haskell 中，單子推導式將列表推導式，推廣為適用於任何單子。 集合推導式 Python 語言用於生成集合的語法示例： s v for v in ABCDABCD if v not in CB print s A D 字典推導式 Python 語言用於生成字典（關聯陣列）的語法示例： s key val for key val in enumerate ABCD if val not in CB print s 0 A 3 D 類似構造 C C 沒有直接支援列表推導的任何語言特性，但運算子過載（例如，過載 ，， ）已成功用於為 嵌入式 查詢領域特定語言提供表示式語法。 或者，可以使用 eraseremove 慣用法來構造列表推導以選擇容器中的元素，並使用 STL 演算法 for_each 來轉換它們。 include algorithm include list include numeric using namespace std templateclass C class P class T C comprehend C source const P predicate const T transformation 初始化目標 C d forwardCsource 元素過濾 derase remove_if begin d end d predicate end d 應用變換 for_each begin d end d transformation return d int main listint range 10 range 是一個有 10 個元素的 list 全是 0 iota begin range end range 1 range 現在包含 1210 listint result comprehend range int xreturn xx 3 int xx 2 結果現在包含 4620 參見 延伸閱讀 List ComprehensionList Comprehension in The Free Online Dictionary of Computing Editor Denis Howe Haskell The Haskell 98 Report chapter 311 List Comprehensions311 List Comprehensions The Glorious Glasgow Haskell Compilation System Users Guide chapter 734 Parallel List Comprehensions734 Parallel List Comprehensions The Hugs 98 Users Guide chapter 512 Parallel list comprehensions aka zipcomprehensions 512 Parallel list comprehensions aka zipcomprehensions OCaml OCaml Batteries IncludedOCaml Batteries Included Language extensions introduced in OCaml Batteries IncludedLanguage extensions introduced in OCaml Batteries Included Python The Python Tutorial List ComprehensionsList Comprehensions Python Language Reference List displaysList displays Python Enhancement Proposal PEP 202 List ComprehensionsPEP 202 List Comprehensions Python Language Reference Generator expressionsGenerator expressions Python Enhancement Proposal PEP 289 Generator ExpressionsPEP 289 Generator Expressions Common Lisp Implementation of a Lisp comprehension macroImplementation of a Lisp comprehension macro by Guy Lapalme Clojure Clojure API documentation for macroClojure API documentation for macro Axiom Axiom stream examplesAxiom stream examples 參考文獻 外部連結 SQLlike set operations with list comprehension oneliners in the Python Cookbook Discussion on list comprehensions in Scheme and related constructs List Comprehensions across languages Category 程式架構 Category 帶有程式碼示例的條目