学习Python时,遇到了zip函数,并了解到它应该可以将两个列表组合成一对。然而,在我的IDE中似乎无法正常工作。
a = ['a','b','c']
b = ['p','q','r']
r = zip(a,b)
print(r)
我希望看到的结果是[('a','p'), ('b','q'), ('c','r')],但实际输出为。这是为什么?我做错了什么?该怎么办?
学习Python时,遇到了zip函数,并了解到它应该可以将两个列表组合成一对。然而,在我的IDE中似乎无法正常工作。
a = ['a','b','c']
b = ['p','q','r']
r = zip(a,b)
print(r)
zip()
返回一个迭代器而不是列表。迭代器求值是惰性的:每次只返回一个项目,并且没有__len__
。迭代器最适合用于循环:事实上,大多数情况下,zip()
将在循环中使用,在那里你只需要一个项目,节省内存和CPU周期。尝试做list(zip(a,b))
以强制评估迭代器为列表。dict(zip(a, b))
和 [low+high for (low, high) in zip(a, b)]
。 - Bryantzip
这样的集合函数返回一个 zip
对象而不是 zip
的结果。只需使用 print(list(r))
打印即可。来自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中与迭代器广泛使用。我认为这会有所帮助 :)
r = list(zip(a, b))
。 - Psidomzip
返回什么? "返回元组的迭代器" - 是迭代器,而不是元组本身。zip
的典型用法是在for
循环中。 - cdarke