学习Python中的 zip()函数

556 阅读3分钟

python zip() function

Python中的zip()函数是一个整洁的小函数,它接收两个或多个序列作为输入,并允许你同时迭代这些序列。为了说明在你的程序中如何使用zip(),我们将在本教程中看一下zip()的几个例子。当我们说迭代变量时,我们指的是 Python 中的各种迭代变量,如列表、元组、字符串等。现在让我们从 zip() 函数的一些例子开始。


zip() 示例一

meats = ['Steak', 'Pork', 'Duck', 'Turkey']
toppings = ['Butter', 'Garlic', 'Olive Oil', 'Cranberry']
for meat, topping in zip(meats, toppings):
    print(f'{meat} topped with {topping}')
Steak topped with Butter
Pork topped with Garlic
Duck topped with Olive Oil
Turkey topped with Cranberry

zip() 实例二

numbers = [1, 2, 3, 4]
str_numbers = ['One', 'Two', 'Three', 'Four']
result = zip(numbers, str_numbers)
print(result)
print(list(result))
[(1, 'One'), (2, 'Two'), (3, 'Three'), (4, 'Four')]

带字典的 zip()

colors = ['Red', 'White', 'Blue']
cars = ['Corvette', 'Bronco', 'Mustang']

my_dict = {}
for color, car in zip(colors, cars):
    my_dict[color] = car
print(my_dict)
{'Red': 'Corvette', 'White': 'Bronco', 'Blue': 'Mustang'}

调用没有可迭代项的zip()。

result = zip()
print(result)
<zip object at 0x0000025021AD51C0>

向zip()传递两个以上的可迭代对象

numerals = [1, 2, 3]
str_numerals = ['One', 'Two', 'Three']
roman_numerals = ['I', 'II', 'III']
result = zip(numerals, str_numerals, roman_numerals)
print(list(result))
[(1, 'One', 'I'), (2, 'Two', 'II'), (3, 'Three', 'III')]

将zip对象转为图元列表

states = ['Massachusetts', 'Colorado', 'California', 'Florida']
capitals = ['Boston', 'Denver', 'Sacremento', 'Tallahassee']
zipped = zip(states, capitals)
ziplist = list(zipped)
print(ziplist)
[('Massachusetts', 'Boston'), ('Colorado', 'Denver'), ('California', 'Sacremento'), ('Florida', 'Tallahassee')]

将zip对象转换为一个字典

states = ['Massachusetts', 'Colorado', 'California', 'Florida']
capitals = ['Boston', 'Denver', 'Sacremento', 'Tallahassee']
zipped = zip(states, capitals)
zipdict = dict(zipped)
print(zipdict)
{'Massachusetts': 'Boston', 'Colorado': 'Denver', 'California': 'Sacremento', 'Florida': 'Tallahassee'}

在Python next()函数中使用zip()

states = ['Massachusetts', 'Colorado', 'California', 'Florida']
capitals = ['Boston', 'Denver', 'Sacremento', 'Tallahassee']
zipped = zip(states, capitals)
while True:
    try:
        tup = next(zipped)
        print(tup[0], "capital is", tup[1])
    except StopIteration:
        break
Massachusetts capital is Boston
Colorado capital is Denver
California capital is Sacremento
Florida capital is Tallahassee

如何解压缩一个已压缩的对象

states = ['Massachusetts', 'Colorado', 'California', 'Florida']
capitals = ['Boston', 'Denver', 'Sacremento', 'Tallahassee']
zipped = zip(states, capitals)
print(zipped)

first, second = zip(*zipped)
print(first)
print(second)
<zip object at 0x000001A6ED61E1C0>
('Massachusetts', 'Colorado', 'California', 'Florida')
('Boston', 'Denver', 'Sacremento', 'Tallahassee')

不同长度的迭代变量

到目前为止,我们所看的所有例子都使用了元素数量相同的迭代表。当你试图对其中一个比另一个长的迭代对象使用 zip() 函数时会发生什么?Python 的默认行为是将操作限制在尺寸较小的迭代表上。这里是一个例子,一个迭代表有 3 个元素,另一个有 5 个元素。

one = [1, 2, 3, 4, 5]
two = ['a', 'b', 'c']

result = zip(one, two)
print(list(result))
[(1, 'a'), (2, 'b'), (3, 'c')]

如果你想改变行为,以便使用较长的迭代器,你可以使用 zip_longest() 函数,这是 itertools 包的一部分。

import itertools as it

one = [1, 2, 3, 4, 5]
two = ['a', 'b', 'c']

result = it.zip_longest(one, two)
print(list(result))
[(1, 'a'), (2, 'b'), (3, 'c'), (4, None), (5, None)]

你可以看到,zip_longest()函数只是为那些由于不同大小的迭代表而存在空值的槽插入了一个None值。如果你想指定一个不同的值,你可以像这样利用fillvalue参数。

import itertools as it

one = [1, 2, 3, 4, 5]
two = ['a', 'b', 'c']

result = it.zip_longest(one, two, fillvalue='😊')
print(list(result))
[(1, 'a'), (2, 'b'), (3, 'c'), (4, '😊'), (5, '😊')]

Python zip() 函数总结

zip()函数接收迭代变量,将它们聚合成一个元组并返回。

zip()函数的语法是:

zip(*iterables)

参数iterables可以是内置的iterables,如list、string、dict,或者用户定义的iterables。

zip()函数返回一个基于可迭代对象的图元迭代器。

  • 如果我们不传递任何参数,zip()返回一个空的迭代器

  • 如果传入一个可迭代对象,zip()返回一个图元的迭代器,每个图元只有一个元素。

  • 如果传递多个迭代器,zip()返回一个图元的迭代器,每个图元包含所有迭代器的元素。

    假设,两个迭代器被传递给zip();一个迭代器包含三个元素,另一个包含五个元素。那么,返回的迭代器将包含三个图元。这是因为当最短的迭代器被用完时,迭代器就会停止。