生成器在Python 2和3中统一迭代字典

Dan*_*iel 8 python python-3.x

有没有办法有效地迭代在Python 2和Python 3中都有效的字典中的值/项?

在Python 2中,我可以写

for x in mydict:
for x in mydict.iterkeys():
for x in mydict.viewkeys():
for x in mydict.itervalues():
for x in mydict.viewvalues():
for x in mydict.iteritems():
for x in mydict.viewitems():
Run Code Online (Sandbox Code Playgroud)

在Python 3中,我有以下可能性:

for x in mydict:
for x in mydict.keys():
for x in mydict.values():
for x in mydict.items():
Run Code Online (Sandbox Code Playgroud)

所以,我可以迭代密钥for x in mydict,并且在Python 2和3中都有效.但是有没有办法迭代普遍适用的值和键值对('items')?我需要它来编写可以在两个Python版本中运行的Python代码.

(另一方面,可以轻松绕过迭代器的其他障碍;例如:

if sys.version_info.major<3:
    from itertools import izip as zip, imap as map
Run Code Online (Sandbox Code Playgroud)

然而,词典的方法不容易被重新定义一样mapzip.)

有任何想法吗?

Joh*_*ooy 9

values()版本只是另一个笨蛋的答案

for value in (mydict[key] for key in mydict):
Run Code Online (Sandbox Code Playgroud)

要么

def dict_values(d):
   return (mydict[key] for key in mydict)

def dict_items(d):
   return ((key, mydict[key]) for key in mydict)

for value in dict_values(mydict):
    ...

for value in dict_items(mydict):
    ...
Run Code Online (Sandbox Code Playgroud)

这非常糟糕.您可以检查python版本,而不是返回生成器,返回d.items()d.iteritems()适当

我认为一个更好的问题可能是如何编写适用于2to3的Python2代码并生成良好的Python3代码


Ray*_*ger 7

以下代码适用于Py2和Py3:

def iteritems(d):
    'Factor-out Py2-to-3 differences in dictionary item iterator methods'
    try:
         return d.iteritems()
    except AttributeError:
         return d.items()

d = dict(red=1, blue=2, green=3)
for k, v in iteritems(d):
    print(k)
    print(v)
    print('')
Run Code Online (Sandbox Code Playgroud)

注意,此解决方案的优点是使用本机迭代器而不是滚动自己的生成器并执行自己的查找.本机迭代器比其他解决方案更快.