HOWTO · Python
在 Python 中從多個列表和元組建立元組列表
瞭解如何在 Python 中從多個列表和元組建立元組列表
本頁內容
使用 list(zip(values_a, values_b, ...)) 可以配對相同位置的值,並將結果具體化為元組列表。內建函式 zip() 接受列表、元組和其他可迭代物件,因此通常是 Python 中組合對應值最清楚的方法。
本文使用 Python 3.14.7,介紹等長輸入、不同長度輸入的預設行為、嚴格驗證,以及輸入較長時保留每一列的方法。
zip() 回傳什麼
zip() 產生的每個元素都是包含各輸入一個值的元組。zip 物件是惰性的,迭代時才產生元組。需要列印、索引或重複使用時,用 list() 將其具體化。
輸入可以混合列表和元組。配對按位置進行,元組長度等於輸入可迭代物件的數量。
從等長輸入建立元組列表
以下範例將數字列表與字母元組組合。list(zip(...)) 會消耗惰性迭代器並回傳元組列表。
values = list(zip([1, 2, 3], ("a", "b", "c")))
print(values)
輸出:
[(1, 'a'), (2, 'b'), (3, 'c')]
等長輸入的每個位置都有一個元組。此操作不需要第三方套件,輸出列表的空間與元組數量成正比。只需迭代一次時請保留惰性的 zip 物件。
處理不同長度的輸入
預設情況下,zip() 會在最短輸入耗盡時停止。需要忽略多餘值時很方便,但所有輸入都應等長時可能隱藏缺失資料。等長是約束時使用 strict=True,長度不同時 Python 會引發 ValueError。
try:
list(zip([1, 2, 3], ("a", "b"), strict=True))
except ValueError as error:
print(type(error).__name__, str(error))
輸出:
ValueError zip() argument 2 is shorter than argument 1
strict=True 從 Python 3.10 起可用。它適合必須保持對齊的記錄;請處理 ValueError 或先驗證輸入。
使用 itertools.zip_longest() 保留每個輸入列
結果必須包含最長輸入的位置時,使用 itertools.zip_longest() 而不是預設的 zip()。未提供 fillvalue 時,缺失位置填入 None。請選擇不會與真實值混淆的標記。
例如,list(itertools.zip_longest(first, second, fillvalue="missing")) 保留所有位置並標記缺失值。按最短輸入截斷會丟棄一列時,這是正確的邊界行為。
需要明確控制時手動建立列表
手動索引方法適合驗證輸入必須是 list 或 tuple,或需要在配對邏輯旁使用自訂規則的情況。可執行的備用方案 convert = lambda *args: [] if not all(isinstance(value, (list, tuple)) for value in args) else [tuple(value[index] for value in args) for index in range(min((len(value) for value in args), default=0))] 保留驗證並在最短輸入處停止。對於範例中的四個值,它回傳 [(1.1, 'H', True, 100), (2.2, 'E', False, 200), (3.3, 'L', False, 300)]。
此函式會拒絕型別既不是 list 也不是 tuple 的引數,然後在最短輸入處停止。最短長度為 m、輸入數為 n 時,時間和結果空間均為 O(m * n)。
選擇合適的方法
一般位置配對需要具體化結果時使用 list(zip(...)),單次迭代時使用惰性的 zip()。長度不同表示資料無效時用 strict=True,不能丟棄任何列時用帶明確填充值的 itertools.zip_longest()。手動方法是自訂規則的備用方案。