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

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

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

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

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

有什么想法吗?

最佳答案

just another dunce's answer 的 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 代码

关于python - 在 Python 2 和 3 中统一迭代字典的生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10408119/

相关文章:

python - 使用具有自签名证书的 django-sslserver 在本地主机上进行的 django facebook 应用程序测试被拒绝

python - 如何漂亮地打印 f 字符串?

python - 输出在字符串中找到的特定单词(从列表中)

python字符串拆分切片并放入列表中

python - 如何在每个命令后停止 python3 打印引用计数

python - 在 Django Python 中将一个 View 重定向到另一个 View

python - 如何将 .py 转换为 .exe(32 位)

python - 如何根据另一个列表的值过滤列表

大数据结构(列表、字典)中的 Python 内存泄漏——可能是什么原因?

Python - 读取具有不同分隔符的数据文本文件