Python 內建函數 zip() 詳細介紹

zip() 是 Python 的一個內建函數,用於將多個可迭代對象(如列表、元組、字符串等)的元素配對組合起來,返回一個迭代器(zip 對象)。

基本語法

zip(*iterables)

基本用法

1. 將兩個列表配對


names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]

zipped = zip(names, ages)
print(list(zipped))  # 輸出: [('Alice', 25), ('Bob', 30), ('Charlie', 35)]

2. 處理不同長度的可迭代對象

當輸入的可迭代對象長度不同時,zip() 會以最短的為準:


names = ['Alice', 'Bob', 'Charlie', 'David']
ages = [25, 30, 35]

zipped = zip(names, ages)
print(list(zipped))  # 輸出: [('Alice', 25), ('Bob', 30), ('Charlie', 35)]
# 'David' 被忽略,因為 ages 只有 3 個元素

3. 解壓縮(反向操作)

可以使用 * 運算符來解壓縮 zip 對象:


zipped_data = [('Alice', 25), ('Bob', 30), ('Charlie', 35)]
names, ages = zip(*zipped_data)
print(names)  # 輸出: ('Alice', 'Bob', 'Charlie')
print(ages)   # 輸出: (25, 30, 35)

進階用法

1. 與 for 循環一起使用

for name, age in zip(names, ages):
    print(f"{name} is {age} years old")

2. 同時迭代三個或更多可迭代對象


names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
cities = ['New York', 'London', 'Paris']

for name, age, city in zip(names, ages, cities):
    print(f"{name} is {age} years old and lives in {city}")

3. 創建字典


keys = ['name', 'age', 'city']
values = ['Alice', 25, 'New York']

person = dict(zip(keys, values))
print(person)  # 輸出: {'name': 'Alice', 'age': 25, 'city': 'New York'}

4. 矩陣轉置

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

transposed = list(zip(*matrix))
print(transposed)  # 輸出: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

注意事項

  1. zip() 返回的是一個迭代器,只能被消費一次。如果需要重複使用,可以轉換為列表或元組。
    zipped = zip(names, ages)
    first_use = list(zipped)  # 第一次使用
    second_use = list(zipped)  # 第二次使用會得到空列表
  2. 如果需要以最長的可迭代對象為準,可以使用 itertools.zip_longest()
  3. 在 Python 2 中,zip() 直接返回列表而不是迭代器。如果需要迭代器行為,可以使用 itertools.izip()

map() 的比較

zip()map() 都可以處理多個可迭代對象,但目的不同:

# 使用 zip
result = zip([1, 2, 3], ['a', 'b', 'c'])
# 輸出: [(1, 'a'), (2, 'b'), (3, 'c')]

# 使用 map
result = map(lambda x, y: (x, y), [1, 2, 3], ['a', 'b', 'c'])
# 輸出: [(1, 'a'), (2, 'b'), (3, 'c')]

總結

zip() 是一個非常有用的工具,特別是在需要同時處理多個相關序列時。它簡化了代碼,提高了可讀性,並且在內存使用上非常高效,因為它返回的是迭代器而不是列表。