[英]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
但是,字典方法不能像map
和zip
这样轻松地重新定义。)
有任何想法吗?
另一个笨蛋的答案的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.