2012-03-29 50 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

相关问题