假设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的哲学是“只有一种方法”吗?
答案 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
否它的堂兄弟iteritems
和itervalues
也不存在。
答案 2 :(得分:4)
我认为python的哲学是'只有一种方法'吗?
items()
和iteritems()
存在的原因是历史性的:
最初,只有items()
存在。它返回了列表。
在Python 2.2中,引入了iteritems()
。它返回了一个迭代器。
在Python 2.7中,引入了viewitems()
。它返回了view。
Python 3借此机会整理了这个:iteritems()
和items()
被删除,viewitems()
被重命名为items()
。
2.x中添加iteritems()
和viewitems()
作为新功能而不是简单地替换items()
的原因是希望保持所有2.x版本向后兼容。