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();一个迭代器包含三个元素,另一个包含五个元素。那么,返回的迭代器将包含三个图元。这是因为当最短的迭代器被用完时,迭代器就会停止。
