Python zip函数 - 奇怪的结果

时间:2016-12-29 20:46:02

标签: python python-3.x generator

学习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>

为什么会这样,我做错了什么?

3 个答案:

答案 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)

来自Python 3 docs

  

<强>拉链(* 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中的迭代器。

我认为这会对你有所帮助:)。