如何在 Python 中展平列表列表

了解如何在 Python 中展平列表清單。將巢狀清單推導式、itertools.chain、sum 和遞歸方法與程式碼範例進行比較。

在編輯器中嘗試此解決方案

概述

在處理矩陣計算、資料庫行或解析資料樹時,您會經常遇到巢狀結構,例如列表列表:「[[1, 2], [3, 4]]」。扁平化此結構意味著將其轉換為包含所有單一元素的一維列表:「[1, 2, 3, 4]」。 Python 提供了幾種優雅的方法來實現這一點。

展平清單清單最常見的和 Pythonic 方法是使用巢狀清單來理解:「[item for sublist in matrix for item in sublist]」。雖然語法一開始看起來有點違反直覺,因為循環的編寫順序與嵌套的「for」循環相同,但它是高度優化的、快速的,並且不需要導入外部庫。

或者,您可以使用“itertools”模組的“chain.from_iterable()”函數。這是最節省記憶體的方法,因為它會傳回一個延遲產生元素的迭代器,而不是立即在記憶體中分配新列表。對於深度嵌套的列表(任意深度),您必須編寫一個遞歸生成器函數來解壓縮所有層級。

程式碼和執行輸出

此腳本示範如何使用清單推導式、itertools.chain 和遞歸解套件來展平清單清單。

flatten_list.py
在編輯器中嘗試
import itertools

matrix = [[1, 2, 3], [4, 5], [6, 7, 8]]

# Method 1: List comprehension (Pythonic and fast)
flat_comp = [item for sublist in matrix for item in sublist]
print("List comprehension:", flat_comp)

# Method 2: itertools.chain (Highly memory efficient)
flat_chain = list(itertools.chain.from_iterable(matrix))
print("itertools.chain:", flat_chain)

# Method 3: Recursive function for deep/irregular nesting
irregular = [1, [2, 3], [[4, 5], 6]]

def flatten_deep(items):
    result = []
    for item in items:
        if isinstance(item, list):
            result.extend(flatten_deep(item))
        else:
            result.append(item)
    return result

print("Deep flatten:", flatten_deep(irregular))
端子輸出
List comprehension: [1, 2, 3, 4, 5, 6, 7, 8]
itertools.chain: [1, 2, 3, 4, 5, 6, 7, 8]
Deep flatten: [1, 2, 3, 4, 5, 6]

逐步實施

  • 對平面 2D 結構使用嵌套列表理解 [nested_list 中的子列表的項目 for sublist 中的項目]。
  • 導入 itertools 並呼叫 itertools.chain.from_iterable(nested_list) 進行惰性、記憶體友善的評估。
  • 定義一個遞歸函數檢查 isinstance(item, list) 來處理任意巢狀的集合。

常見問題解答

我可以使用 sum() 函數來展平列表嗎?

是的, sum(matrix, []) 可以工作,但強烈建議不要這樣做。它的運行複雜度為 O(N^2),因為它在每次新增時都會建立一個新的清單副本,從而導致大型資料集的效能很差。

展平清單清單最快的方法是什麼?

itertools.chain.from_iterable() 通常是最快的,緊接在後的是巢狀清單推導式。

相關主題

推薦的 Python 資源

透過相關的互動式教學、備忘單和程式碼比較來擴展您的知識。