迭代Python 3中的字典items(),values(),keys()

max*_*max 41 python dictionary iterator python-3.x

如果我理解正确,在Python 2中,iter(d.keys())就像是一样d.iterkeys().但现在,d.keys()是一个视图,它位于列表和迭代器之间.视图和迭代器之间有什么区别?

换句话说,在Python 3中,有什么区别

for k in d.keys()
    f(k)
Run Code Online (Sandbox Code Playgroud)

for k in iter(d.keys())
    f(k)
Run Code Online (Sandbox Code Playgroud)

另外,这些差异如何在一个简单的for循环中显示(如果有的话)?

mik*_*kej 66

我不确定这是否是你问题的答案,但希望它能解释一下Python 2和3在这方面的区别.

在Python 2,iter(d.keys())d.iterkeys()不太等价的,尽管它们具有相同的行为.在第一个中,keys()将返回字典的键列表的副本,iter然后将在此列表上返回一个迭代器对象,第二个将永远不会构建完整的键列表的副本.

d.keys()Python 3中返回的视图对象是可迭代的(即可以从它们for k in d.keys()创建迭代器),所以当你说Python将为你创建迭代器时.因此,您的两个示例将表现相同.

返回类型更改的意义在于keys()Python 3视图对象是动态的.即如果我们说ks = d.keys(),以后添加d到那ks将反映这一点.在Python 2中,keys()返回当前在dict中的所有键的列表.相比:

Python 3

>>> d = { "first" : 1, "second" : 2 }
>>> ks = d.keys()
>>> ks
dict_keys(['second', 'first'])
>>> d["third"] = 3
>>> ks
dict_keys(['second', 'third', 'first'])
Run Code Online (Sandbox Code Playgroud)

Python 2.x

>>> d = { "first" : 1, "second" : 2 }
>>> ks = d.keys()
>>> ks
['second', 'first']
>>> d["third"] = 3
>>> ks
['second', 'first']
Run Code Online (Sandbox Code Playgroud)

当Python 3 keys()返回动态对象时,Python 3没有(并且不需要)单独的iterkeys方法.

进一步澄清

在Python 3中,keys()返回一个dict_keys对象,但如果我们在for循环上下文中使用它,for k in d.keys()则隐式创建迭代器.因此,for k in d.keys()和之间的区别for k in iter(d.keys())是迭代器的隐式与显式创建之一.

就另一个区别而言,虽然它们都是动态的,但请记住,如果我们创建一个显式迭代器,那么它只能使用一次,而视图可以根据需要重用.例如

>>> ks = d.keys()
>>> 'first' in ks
True
>>> 'second' in ks
True
>>> i = iter(d.keys())
>>> 'first' in i
True
>>> 'second' in i
False             # because we've already reached the end of the iterator
Run Code Online (Sandbox Code Playgroud)

另外,请注意,如果我们创建一个显式迭代器然后修改dict,那么迭代器将失效:

>>> i2 = iter(d.keys())
>>> d['fourth'] = 4
>>> for k in i2: print(k)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
Run Code Online (Sandbox Code Playgroud)

在Python 2中,由于keys需要单独方法的现有行为,因此需要提供一种迭代方法,而无需复制键列表,同时仍保持向后兼容性.于是iterkeys()

  • 在2.7中有`.viewkeys()`.返回视图.http://docs.python.org/library/stdtypes.html#dict.viewkeys (5认同)