2012-05-02 69 views
8

有没有一种方法可以有效地迭代Python 2和Python 3中同时使用的字典中的值/项?生成器在Python 2和Python 3中统一遍历字典

在Python 2,我可以写

​​

,并在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 

然而,词典的方法不能容易地像mapzip重新定义。)

不限想法?

+1

编辑:我想你的意思是说发电机遍历字典 – jamylak

+0

@jamylak:是的,谢谢。 – Daniel

回答

9

值()的版本回答

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()适当

我想一个更好的问题可能是如何写Python2代码与2to3的效果很好,并产生良好的Python3代码

+4

最后一句话+1。 – Daenyth

+0

我赞成gnibbler提议检查Python版本(一次,在Python脚本的开始处)并定义返回正确的迭代器'd.items()'或'd.iteritems()'的函数。 – Daniel

0

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

+0

但是在Python2中''.items()'建立了一个OP正试图避免的临时列表 –

+0

这个问题不是很清楚,但我认为作者想要生成器。我改变了问题的标题以反映这一点。 – jamylak

+0

我没注意到。谢谢。 –

3

这会给你一台发电机:

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

如果你想有一个列表,使用[]周围的表达,而不是又一个傻瓜的的()在外面

+1

一个更简单的方法是使用mydict.iteritems() –

+0

你在帖子中有什么可以在2和3中工作,但''。iteritems()'在3.中不存在,至少不是通过该名称,它被重命名为'.items()'。 –

+0

您可以使用上面的解决方案。我宁愿远离列表,因为如果字典大小太大,我相信创建一个新列表会创建一个大列表。 –

7

的下面的代码工作在两个的Py2和PY 3:

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('') 

注意,该解决方案具有使用原生的迭代器,而不是滚动您自己的发电机,做自己查找的优势。本地迭代器比其他解决方案更快。