在所有地方使用items()
而不是iteritems()
是否合法?爲什麼從Python 3中刪除iteritems()
?看起來像一個了不起的和有用的方法。它背後的理由是什麼?Python中的iteritems
編輯:爲了澄清,我想知道什麼是正確的習慣用類似於生成器的方式遍歷字典(一次一個項目,而不是全部到內存中)以兼容Python 2和Python 3?
在所有地方使用items()
而不是iteritems()
是否合法?爲什麼從Python 3中刪除iteritems()
?看起來像一個了不起的和有用的方法。它背後的理由是什麼?Python中的iteritems
編輯:爲了澄清,我想知道什麼是正確的習慣用類似於生成器的方式遍歷字典(一次一個項目,而不是全部到內存中)以兼容Python 2和Python 3?
在Python 2.x中 - .items()
返回(鍵,值)對的列表。在Python 3.x中,.items()
現在是一個itemview
對象,它的行爲不同 - 因此有需要迭代或物化......因此,是Python 2.x中dict.items()
的必需對象。
的Python 2.7也有一個有點背口密鑰處理的,因爲你有viewkeys
,viewitems
和viewvalues
方法,最有用的是viewkeys
其行爲更像是一個set
(你會從dict
期待)。
簡單的例子:
common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())
會給你常用鍵的列表,但同樣,在Python 3.x的 - 只需使用.keys()
代替。
的Python 3.x中已普遍取得更「懶」 - 即map
現在是有效itertools.imap
,zip
是itertools.izip
等
dict.iteritems
被刪除,因爲dict.items
現在做的東西dict.iteritems
在Python 2.x的那樣,甚至使它成爲一個itemview
提高了一點。
正如@Wessie注意到,dict.iteritems
,dict.iterkeys
和dict.itervalues
(其在Python2.x返回一個迭代)以及dict.viewitems
,dict.viewkeys
dict.viewvalues
和(返回視圖對象在Python2.x)在Python3.x
而dict.items
,dict.keys
和用於返回字典在Python2.x列表的副本現在回到視圖對象Python3.x,但dict.values
他們還是不一樣的迭代。
如果你想在Python3.x返回迭代,使用:
$ 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'>
你不能在所有的Python地方使用items
代替iteritems
。例如,下面的代碼:如果您使用items
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)]
將打破:
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'
同樣是真實的viewitems,這是可以在Python 3
而且,由於items返回字典的(key, value)
對列表的副本,效率較低,除非您想要創建副本。
在Python 2中,最好使用iteritems
進行迭代。該2to3
工具可以用items
取代它,如果你決定要升級到Python 3
The six library與書寫代碼,並與這兩個蟒蛇2.5+和Python 3兼容。它有一個iteritems方法,將在兩個工作蟒蛇幫助2和3.示例:
from __future__ import division, absolute_import, print_function, unicode_literals
import six
d = dict(foo=1, bar=2)
for k, v in six.iteritems(d):
print(k, v)
我明白''iteritems''是一個迭代器,這就是爲什麼它非常有用。我幾乎從不想將字典作爲列表迭代。那麼用什麼生成器像Python 2和3兼容的方式迭代字典的正確方法是什麼? – user248237dfsf
@ user248237'對於some_dict中的鍵''對兩個都有效 - '2to3'工具會將'iteritems()'翻譯爲'items()'無論如何...... –
@JonClements:儘管我一直認爲「在d:d [k]中的k是不必要的冗長/不合理的 – user248237dfsf