2016-12-29 75 views
2

学习python,遇到了压缩函数,并明白它应该建立2对列表。但是,它似乎并没有在我的IDE中工作。Python压缩函数 - 奇怪的结果

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

在这里,我期望的打印[( '一个', 'P'),( 'B', 'Q'),( 'C', 'R')]。但是,打印输出然后是:<zip object at 0x011E57D8>

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

+1

你需要'r = list(zip(a,b))'。 – Psidom

+1

文档说“zip”返回了什么? “*返回元组的迭代器*” - 一个迭代器,而不是元组本身。 'zip'的典型用法是在'for'循环中 – cdarke

回答

7

您正在使用Python 3.在Python 3中,zip()返回迭代器而不是列表。

迭代器评估是懒惰的:一次只返回一个项目,并且没有__len__。迭代器最适合循环:实际上,大多数时候,zip()将用于循环,一次只需要一个项目,从而节省内存和CPU周期。

只需尝试执行list(zip(a,b))即可将迭代器评估强制为列表。

+0

也可以尝试'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))打印它。

+0

@ Psidom总体上Python 3默认为懒惰评估,Python 2不会。 –

+1

@Psidom我编辑它来显示。谢谢! –

1

Python 3 docs

拉链(* iterables)

做一个迭代其聚集来自每个iterables的元件。

在Python中,您使用循环遍历一个对象(表,字典,字符串,等等)。在一个较低的水平,在循环实现这样的:

>>> 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() 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

但是,最好的方法是使用列表()。它在Python中用于迭代器。

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