143 python python-3.x
是否合法使用items()
而不是iteritems()
在所有地方使用?为什么iteritems()
从Python 3 中删除?看起来像一个了不起的有用的方法.背后的原因是什么?
编辑:为了澄清,我想知道以类似生成器的方式迭代字典的正确习惯用法(一次一个项目,而不是全部到内存中)以与Python 2和Python 3兼容的方式进行迭代?
Jon*_*nts 136
在Python 2.x中 - .items()
返回了一个(键,值)对的列表.在Python 3.x中,.items()
现在是一个itemview
行为不同的对象 - 所以它必须被迭代或实现......所以,Python 2.x中的list(dict.items())
内容是必需的dict.items()
.
Python 2.7版也有一个有点背口密钥处理的,在你有viewkeys
,viewitems
而且viewvalues
方法,最有用的存在viewkeys
,其表现更像是一个set
(你想从预期dict
).
简单的例子:
common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())
Run Code Online (Sandbox Code Playgroud)
将为您提供公共密钥的列表,但同样,在Python 3.x中 - 只需使用.keys()
.
Python 3.x通常被认为更"懒惰" - 即map
现在是有效的itertools.imap
,zip
是itertools.izip
等等.
Dea*_*evy 59
这六个库有助于编写与python 2.5+和python 3兼容的代码.它有一个iteritems方法,可以在python 2和3中工作.示例:
import six
d = dict( foo=1, bar=2 )
for k, v in six.iteritems(d):
print(k, v)
Run Code Online (Sandbox Code Playgroud)
正如python 2和python 3的字典文档会告诉你的那样,在python 2中items
返回一个列表,同时iteritems
返回一个迭代器.
在python 3中,items
返回一个视图,它与迭代器几乎相同.
如果你正在使用python 2,你可能想要用户,iteritems
如果你正在处理大型词典,你想要做的就是迭代这些项目(不一定要将它们复制到列表中)
正如@Wessie指出的,dict.iteritems
,dict.iterkeys
和dict.itervalues
(它返回一个迭代中Python2.x)以及dict.viewitems
,dict.viewkeys
和dict.viewvalues
(返回查看对象中Python2.x)均在Python3.x除去
而且dict.items
,dict.keys
和dict.values
用于返回一个副本中Python2.x字典的名单现在返回视图对象在Python3.x,但他们还是不一样的迭代器.
如果要在Python3.x中返回迭代器,请使用iter(dictview)
:
$ python3.3
>>> d = {'one':'1', 'two':'2'}
>>> type(d.items())
<class 'dict_items'>
>>>
>>> type(d.keys())
<class 'dict_keys'>
>>>
>>>
>>> ii = iter(d.items())
>>> type(ii)
<class 'dict_itemiterator'>
>>>
>>> ik = iter(d.keys())
>>> type(ik)
<class 'dict_keyiterator'>
Run Code Online (Sandbox Code Playgroud)
不能使用items
,而不是iteritems
在所有的Python的地方.例如,以下代码:
class C:
def __init__(self, a):
self.a = a
def __iter__(self):
return self.a.iteritems()
>>> c = C(dict(a=1, b=2, c=3))
>>> [v for v in c]
[('a', 1), ('c', 3), ('b', 2)]
Run Code Online (Sandbox Code Playgroud)
如果你使用会破坏items
:
class D:
def __init__(self, a):
self.a = a
def __iter__(self):
return self.a.items()
>>> d = D(dict(a=1, b=2, c=3))
>>> [v for v in d]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __iter__ returned non-iterator of type 'list'
Run Code Online (Sandbox Code Playgroud)
对于viewitems也是如此,它在Python 3中可用.
此外,由于items返回字典对列表的副本(key, value)
,因此效率较低,除非您想要创建副本.
在Python 2中,最好iteritems
用于迭代.如果您决定升级到Python 3,该2to3
工具可以替换它items
.
future.utils
允许 python 2 和 3 兼容性。
# Python 2 and 3: option 3
from future.utils import iteritems
heights = {'man': 185,'lady': 165}
for (key, value) in iteritems(heights):
print(key,value)
>>> ('lady', 165)
>>> ('man', 185)
Run Code Online (Sandbox Code Playgroud)
请参阅此链接:https ://python-future.org/completed_idioms.html
归档时间: |
|
查看次数: |
201315 次 |
最近记录: |