學習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>
爲什麼是這樣,我做錯了什麼?
學習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>
爲什麼是這樣,我做錯了什麼?
您正在使用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
您正在使用Python 3.由於Python 3是懶惰的(與Python 2相比),收集函數(如zip
)將返回zip
對象,而不是zip
的結果。只需使用print(list(r))
打印它。
@ Psidom總體上Python 3默認爲懶惰評估,Python 2不會。 –
@Psidom我編輯它來顯示。謝謝! –
拉鍊(* 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中用於迭代器。
我認爲這會對你有幫助:)
你需要'r = list(zip(a,b))'。 – Psidom
文檔說「zip」返回了什麼? 「*返回元組的迭代器*」 - 一個迭代器,而不是元組本身。 'zip'的典型用法是在'for'循環中 – cdarke