繁体   English   中英

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

[英]Generators to iterate over a dictionary uniformly in both Python 2 and 3

有没有一种方法可以有效地迭代适用于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使用for x in mydict遍历键,该键在Python 2和3中都可以使用。但是是否有一种方法可以遍历通用的值和键值对(“项”)? 我需要它来编写可以在两个Python版本中运行的Python代码。

(附带说明,使用迭代器可以轻松绕过其他障碍;例如:

if sys.version_info.major<3:
    from itertools import izip as zip, imap as map

但是,字典方法不能像mapzip这样轻松地重新定义。)

有任何想法吗?

另一个笨蛋的答案的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兼容并生成良好的Python3代码的Python2代码

以下代码适用于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('')

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

这将为您提供一个生成器:

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

如果需要列表,请在表达式周围使用[]而不是外部的()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM