Python 中的 Zip() 函数有什么作用?让我们了解它吧

举报
Tiamo_T 发表于 2021/10/01 20:55:23 2021/10/01
【摘要】 如果您还没有使用过 Python zip() 函数,这是一个了解它是如何工作的以及如何在您的程序中使用它的机会。Python zip() 函数将多个可迭代对象作为输入,并返回一个元组迭代器,其中第 n 个元组包含每个可迭代对象的第 n 个元素。zip 函数也可以应用于不同长度的迭代,在这种情况下,当最小的迭代用完时它会停止。我们将通过一些示例来了解如何将 zip 函数应用于多种 Python...

如果您还没有使用过 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 函数非常有趣,它允许使用迭代执行操作,否则需要自定义代码。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。