2012-03-29 20 views
3

假設mydict是一個Python字典。字典爲什麼需要這些'iter'方法?

mydict = {'a': 1, 'b': 2} 

我可以用items遍歷它的元素:

for k,v in mydict.items(): 
    print k,v 

或者使用iteritems

for k,v in mydict.iteritems(): 
    print k,v 

有什麼區別?我認爲python的理念是「只有一種方法可行」?

+0

這已[已被問](http://stackoverflow.com/q/4550645/589206)之前與一個非常詳細的接受答案。 – hochl 2012-03-29 14:18:26

回答

6

在Python 3中,dict.iter...()方法已被刪除並替換正常的方法。

它們作爲迭代器添加到字典後的語言中存在,所以dict.items()返回一個列表。已添加dict.iter...()方法以允許人們製作更高效的程序(因爲迭代器是懶惰的),但也不會破壞與期望列表的舊程序的兼容性。

由於Python 3打破了兼容性,這已被修復。 (中dict.iter()舊的使用可以與list(dict.iter())生成需要注意的是在Python 3 dict.items()實際上返回一個dictionary view - 。它可以遍歷,而且還提供其他功能

4

在Python 2,mydict.items返回一個新的列表 。使用iteritems節省內存,而且是更有效的。

>>> d = dict((f, r) for f, r in zip(range(10000), reversed(range(10000)))) 
>>> %timeit for i in d.iteritems(): i 
1000 loops, best of 3: 456 us per loop 
>>> %timeit for i in d.items(): i 
1000 loops, best of 3: 811 us per loop 

但(正如其他人所指出的)items是保持不變在Python 2向後兼容。

在Python 3中,此問題已修復; items返回一個「view」(它既不是列表也不是迭代器,而是字典條目變化時的「動態視圖」),並且iteritems不再存在,它的表兄弟itervaluesiterkeys也不再存在。

4

我認爲python的哲學是'只有一種方法可以做'?

的原因既items()iteritems()存在是歷史性的:

  1. 最初,只有items()存在。它返回了列表

  2. 在Python 2.2中,iteritems()被介紹了。它返回了一個迭代器

  3. 在Python 2.7中,viewitems()被介紹了。它返回了一個view

  4. 的Python 3藉機整理一下這件事:iteritems()items()得到了下降,viewitems()得到改名爲items()

原因iteritems()viewitems()在2.x中添加新的功能,而不是簡單地更換items()是把所有2.x版本向後兼容的願望。

+0

python 3中的items()會返回一個「視圖」,它不是一個迭代器:它基本上是一個懶惰的列表。要遍歷它,你需要'iter(d.keys())'等。檢出PEP 3106. – alexis 2012-03-29 14:07:05

+0

@alexis:我已經修復了這個問題。請參閱最新的答案。 – NPE 2012-03-29 14:08:21

相關問題