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

时间:2012-05-02 05:22:29

标签: 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():

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

for x in mydict:
for x in mydict.keys():
for x in mydict.values():
for x in mydict.items():

所以,我可以使用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

但是,无法像mapzip那样轻松重新定义字典方法。)

有什么想法吗?

4 个答案:

答案 0 :(得分:9)

values()版本的另一个绅士的回答

for value in (mydict[key] for key in mydict):

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):
    ...

但这非常糟糕。您可以检查python版本而不是返回生成器,根据需要返回d.items()d.iteritems()

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

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

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

答案 2 :(得分:3)

这会给你一个发电机:

for key,value in ((key,mydict[key] for key in mydict)

如果你想要一个列表,请在表达式周围使用[]而不是外部的

答案 3 :(得分:0)

Python2.7在字典中有一个.items方法,允许你迭代(键,值)元组。 Python3具有相同的API(尽管实现方式不同)。这对你有用吗?