学习python,遇到了zip函数,并了解它应该构建两对列表。但是,它似乎在我的IDE中不起作用。
a = ['a','b','c']
b = ['p','q','r']
r = zip(a,b)
print(r)
这里我希望打印[('a','p'),('b','q'),('c','r')]。但是,打印输出为:<zip object at 0x011E57D8>
为什么会这样,我做错了什么?
答案 0 :(得分:7)
您正在使用Python 3.在Python 3中,zip()
返回迭代器而不是列表。
迭代器评估是懒惰的:一次只返回一个项目,并且没有__len__
。迭代器最适合循环:实际上,大多数情况下zip()
将在循环中使用,一次只需要一个项目,节省内存和CPU周期。
尝试执行list(zip(a,b))
以强制将迭代器的评估放入列表中。
答案 1 :(得分:1)
您正在使用Python 3.由于Python 3是惰性的(与Python 2相比),像zip
这样的集合函数会返回zip
对象而不是zip
的结果。只需使用print(list(r))
打印即可。
答案 2 :(得分:1)
<强>拉链(* 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()是一个迭代器,你应该把它变成任何数据结构(list,tuple,set,dict)。每次调用 zip()( next())时,它都会返回一个包含所需对的元组。所以你必须将这些元组附加到列表中。
list() function就是这样。它需要一个可迭代的(在你的例子中,迭代器函数 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)] # This is a comprehension
但最好的方法是使用 list()。它广泛用于Python中的迭代器。
我认为这会对你有所帮助:)。