为什么字典需要那些'iter'方法?

时间:2012-03-29 13:55:01

标签: python iterator

假设mydict是Python词典。

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的哲学是“只有一种方法”吗?

3 个答案:

答案 0 :(得分:6)

在Python 3中,dict.iter...()方法已被删除并替换正常方法。

它们存在,因为迭代器在字典后被添加到语言中,因此dict.items()返回一个列表。添加了dict.iter...()方法以允许人们制作更高效的程序(因为迭代器是懒惰的),但也不会破坏与期望列表的旧程序的兼容性。

由于Python 3破坏了兼容性,因此修复了这一问题。 (可以使用dict.iter()生成list(dict.iter())的旧用法。请注意,在Python 3 dict.items()实际上返回dictionary view - 可以迭代,但也提供其他功能

答案 1 :(得分: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

但是(正如其他人所指出的那样){2}在Python 2中保持不变,以实现向后兼容。

在Python 3中,这个问题已修复; items返回一个“view”(既不是列表也不是迭代器,而是“字典条目的动态视图”,当字典更改时会发生变化)和items否它的堂兄弟iteritemsitervalues也不存在。

答案 2 :(得分:4)

  

我认为python的哲学是'只有一种方法'吗?

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

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

  2. 在Python 2.2中,引入了iteritems()。它返回了一个迭代器

  3. 在Python 2.7中,引入了viewitems()。它返回了view

  4. Python 3借此机会整理了这个:iteritems()items()被删除,viewitems()被重命名为items()

  5. 2.x中添加iteritems()viewitems()作为新功能而不是简单地替换items()的原因是希望保持所有2.x版本向后兼容。