Python的zip函数 - 奇怪的结果

3

学习Python时,遇到了zip函数,并了解到它应该可以将两个列表组合成一对。然而,在我的IDE中似乎无法正常工作。

a = ['a','b','c']
b = ['p','q','r']
r = zip(a,b)
print(r)

我希望看到的结果是[('a','p'), ('b','q'), ('c','r')],但实际输出为。这是为什么?我做错了什么?该怎么办?

1
你需要 r = list(zip(a, b)) - Psidom
1
文档中说zip返回什么? "返回元组的迭代器" - 是迭代器,而不是元组本身。 zip的典型用法是在for循环中。 - cdarke
3个回答

7
你正在使用Python 3。在Python 3中,zip()返回一个迭代器而不是列表。迭代器求值是惰性的:每次只返回一个项目,并且没有__len__。迭代器最适合用于循环:事实上,大多数情况下,zip()将在循环中使用,在那里你只需要一个项目,节省内存和CPU周期。尝试做list(zip(a,b))以强制评估迭代器为列表。

也可以尝试使用 dict(zip(a, b))[low+high for (low, high) in zip(a, b)] - Bryant

1
你正在使用 Python 3。因为 Python 3 比 Python 2 更懒惰,所以像 zip 这样的集合函数返回一个 zip 对象而不是 zip 的结果。只需使用 print(list(r)) 打印即可。

总的来说,Python 3 默认采用惰性求值,而 Python 2 则不是。 - Eli Sadoff

1

来自Python 3文档

zip(*iterables)

创建一个迭代器,从每个可迭代对象中聚合元素。

在Python中,您使用for循环遍历对象(列表、字典、字符串等)。 在较低的级别上,for循环的实现方式如下:

>>> x = iter([1, 2, 3])
>>> x
<listiterator object at 0x1004ca850>
>>> x.next()
1
>>> x.next()
2
>>> x.next()
3
>>> x.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

内置函数iter接受一个可迭代对象并返回一个迭代器。每次我们调用方法next(),迭代器都会返回下一个元素。如果没有更多元素,则会引发StopIteration。

来源: http://anandology.com/python-practice-book/iterators.html

zip()是一个迭代器,你应该将它转换为任何数据结构(列表,元组,集合,字典)。每次调用zip()(next())时,它都会返回一个包含所需对的元组。因此,您必须将这些元组附加到列表中。

list()函数正是做这件事情的。它接受一个可迭代对象(在您的情况下是迭代器函数 zip()),并将其构造为列表。

a = ['a', 'b', 'c']
b = ['p', 'q', 'r']
r = list(zip(a, b))
print(r)

>>> [('a', 'p'), ('b', 'q'), ('c', 'r')]

这与以下内容相同:

a = ['a', 'b', 'c']
b = ['p', 'q', 'r']
r = []

for pair in zip(a, b):
    r.append(pair)

print(r)

>>> [('a', 'p'), ('b', 'q'), ('c', 'r')]

甚至更简短的方法是使用r = [pair for pair in zip(a, b)] # 这是一种推导式。但最好的方法是使用list(),在Python中与迭代器广泛使用。我认为这会有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接