8

有没有办法有效地迭代在 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 中都有效。但是有没有一种方法可以迭代通用的值和键值对(“项目”)?我需要它来编写可以在两个 Python 版本中运行的 Python 代码。

(附带说明一下,可以轻松绕过带有迭代器的其他障碍;例如:

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

但是,字典方法不能像map和那样轻易地重新定义zip。)

有任何想法吗?

4

4 回答 4

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 配合良好并生成好的 Python3 代码的 Python2 代码

于 2012-05-02T05:34:41.627 回答
8

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

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

于 2012-05-02T06:56:15.023 回答
3

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

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

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

于 2012-05-02T05:29:37.677 回答
0

Python2.7.items在字典中有一个方法可以让你遍历 (key,value) 元组。Python3 具有相同的 API(尽管实现不同)。这对你有用吗?

于 2012-05-02T05:27:17.177 回答