Python 中的 Zip() 函数有什么作用?让我们了解它吧
如果您还没有使用过 Python zip() 函数,这是一个了解它是如何工作的以及如何在您的程序中使用它的机会。
Python zip() 函数将多个可迭代对象作为输入,并返回一个元组迭代器,其中第 n 个元组包含每个可迭代对象的第 n 个元素。zip 函数也可以应用于不同长度的迭代,在这种情况下,当最小的迭代用完时它会停止。
我们将通过一些示例来了解如何将 zip 函数应用于多种 Python 数据类型。
应用于两个列表的 Python Zip 函数
Python zip() 函数从多个可迭代对象聚合项目并返回一个元组迭代器。
zip(*iterables)
如果只是这样解释可能有点抽象,让我们看看它在应用于两个列表时在实践中是如何工作的。
>>> cities = ['Warsaw', 'Rome', 'Prague']
>>> countries = ['Poland', 'Italy', 'Czech Republic']
>>> zip(cities, countries)
<zip object at 0x7f94081e9240>
如前所述,返回的 zip 对象是元组的迭代器,让我们看看是否可以遍历它……
>>> for value in zip(cities, countries):
... print(value)
...
('Warsaw', 'Poland')
('Rome', 'Italy')
('Prague', 'Czech Republic')
正如您所看到的,迭代器返回的每个项目都是一个元组,其中第一个元素来自第一个列表,第二个元素来自第二个列表。
当 Python zip 应用于三个或更多列表时,结果是相同的。
您还可以在for 循环中使用以下方法:
>>> for city, country in zip(cities, countries):
... print(city, country)
...
Warsaw Poland
Rome Italy
Prague Czech Republic
它允许直接引用每个元组中的每个项目,而无需通过索引访问每个元组的元素。
Python Zip 函数应用于不同长度的列表
现在,让我们看另一个如何使用 zip 函数的例子。
如果我们从第二个列表中删除一个元素会发生什么?
>>> cities = ['Warsaw', 'Rome', 'Prague']
>>> countries = ['Poland', 'Italy']
>>> for value in zip(cities, countries):
... print(value)
...
('Warsaw', 'Poland')
('Rome', 'Italy')
当两个不同大小的列表被传递给 zip 函数时,当最短列表用完时,返回的元组迭代器将停止。
应用于单个列表的 Zip 函数
考虑到 zip() 函数将来自多个可迭代对象的元素放在一起,我想知道如果我们只将一个列表传递给它会发生什么。
>>> cities = ['Warsaw', 'Rome', 'Prague']
>>> for value in zip(cities):
... print(value)
...
('Warsaw',)
('Rome',)
('Prague',)
如果将单个列表(或可迭代的)传递给 Python zip 函数,它将返回一个 1 元组(具有单个元素的元组)的迭代器。
您可以将 Zip 函数用于不同的数据类型吗?
我们已经看到了如何在两个列表中使用 zip().,但我想知道我们是否可以将不同的数据类型传递给 zip 函数。
例如,假设我们有两个元组(元组是可迭代的)和一个列表。
>>> cities = ('Warsaw', 'Rome', 'Prague')
>>> countries = ('Poland', 'Italy', 'Czech Republic')
>>> languages = ['Polish', 'Italian', 'Czech']
>>> list(zip(cities, countries, languages))
[('Warsaw', 'Poland', 'Polish'), ('Rome', 'Italy', 'Italian'), ('Prague', 'Czech Republic', 'Czech')]
zip 函数的结果完全一样,元组的迭代器。
返回的第一个元组包含第一个元组中的第一项、第二个元组中的第一项和列表中的第一项。
这同样适用于第二和第三元组。
还要注意,这次我们使用了 list() 内置函数将迭代器转换为list。
考虑到如果您尝试打印 zip 函数返回的对象,您将看不到太多内容(只是一个 zip 对象),因此需要转换为列表才能查看迭代器返回的元组:
>>> print(zip(cities, countries, languages))
<zip object at 0x7fe4e02e9740>
如何压缩两个列表列表
让我们把事情弄得更复杂一点,我想看看当我们尝试压缩两个列表时会发生什么。
你怎么认为?
>>> numbers_group1 = [[1, 2], [3, 4], [5, 6]]
>>> numbers_group2 = [[7, 8], [9, 10], [11, 12]]
>>> list(zip(numbers_group1, numbers_group2))
[([1, 2], [7, 8]), ([3, 4], [9, 10]), ([5, 6], [11, 12])]
原理是一样的,zip函数返回的迭代器是元组的迭代器。
当您将 zip() 函数应用于两个列表列表时,结果是一个元组迭代器,其中每个元组都有两个元素,给定元组中的每个元素都是一个列表。
例如,如果要访问第一个元组中第一个列表的第一个数字,可以使用以下语法。
>>> list(zip(numbers_group1, numbers_group2))[0][0][0]
1
使用带有两个字符串的 Zip 函数
Python 字符串是可迭代的,因此它们可以传递给 zip() 函数。
定义两个字符串并将它们传递给 zip 函数...
>>> value1 = "hello"
>>> value2 = "Codefather"
>>> for value in zip(value1, value2):
... print(value)
...
('h', 'C')
('e', 'o')
('l', 'd')
('l', 'e')
('o', 'f')
应用于两个字符串时的 zip 函数返回一个元组迭代器,其中每个元组包含每个字符串中的一个字符。
正如我们之前看到的,迭代器在两者之间的最短字符串处停止。
现在假设您想将 zip() 函数的输出合并为一个字符串。
你会怎么做?
提示:您可以使用字符串 join() 函数。
让我们从这里开始,我们要创建一个字符串“ hCeoldleof”。
>>> list(zip(value1, value2))
[('h', 'C'), ('e', 'o'), ('l', 'd'), ('l', 'e'), ('o', 'f')]
首先,我们可以用生成器表达式连接每个元组的字符。
>>> (''.join(x) for x in zip(value1, value2))
<generator object <genexpr> at 0x7f93f80913c0>
>>> list(''.join(x) for x in zip(value1, value2))
['hC', 'eo', 'ld', 'le', 'of']
然后我们可以再次应用 join() 函数将每个元素合并为一个字符串。
>>> ''.join(''.join(x) for x in zip(value1, value2))
'hCeoldleof'
任务完成!!😀
将 Zip 函数与 Python 集结合使用
Python 集合是可迭代对象,因此可以对它们应用 zip() 函数。
让我们看看当我们将以下两个集合传递给 zip 函数时会发生什么。
>>> cities = {'Warsaw', 'Rome', 'Prague'}
>>> countries = {'Poland', 'Italy', 'Czech Republic'}
这是转换为列表的 zip 函数的输出。
>>> print(zip(cities, countries))
<zip object at 0x7f94081e9300>
>>> print(list(zip(cities, countries)))
[('Warsaw', 'Poland'), ('Prague', 'Italy'), ('Rome', 'Czech Republic')]
所以,我们再一次从迭代器中得到一个元组列表。每个元组包含第一组中的一项和第二组中的一项。
我想向您展示另一种查看迭代器返回的元组的方法。
>>> merged_sets = zip(cities, countries)
>>> next(merged_sets)
('Warsaw', 'Poland')
>>> next(merged_sets)
('Prague', 'Italy')
>>> next(merged_sets)
('Rome', 'Czech Republic')
>>> next(merged_sets)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
为了遍历迭代器,我们使用了Python next() 函数。
如何将两个列表压缩到字典中
zip 函数可以与 dict() 函数一起使用,以从两个列表开始创建字典。
正如我们之前看到的,如果您将 zip 函数返回的迭代器转换为列表,这就是您得到的结果。
>>> attributes = ['country', 'capital', 'language']
>>> values = ['Poland', 'Warsaw', 'Polish']
>>> print(list(zip(attributes, values)))
[('country', 'Poland'), ('capital', 'Warsaw'), ('language', 'Polish')]
要创建字典而不是使用 list() 函数,我们可以将dict() 函数应用于 zip 函数返回的迭代器。
>>> print(dict(zip(attributes, values)))
{'country': 'Poland', 'capital': 'Warsaw', 'language': 'Polish'}
当您想从现有的键和值创建字典时要记住的一个小技巧。
结论
zip 函数非常有趣,它允许使用迭代执行操作,否则需要自定义代码。
- 点赞
- 收藏
- 关注作者
评论(0)