2012-12-21 24 views
92

在所有地方使用items()而不是iteritems()是否合法?爲什麼從Python 3中刪除iteritems()?看起來像一個了不起的和有用的方法。它背後的理由是什麼?Python中的iteritems

編輯:爲了澄清,我想知道什麼是正確的習慣用類似於生成器的方式遍歷字典(一次一個項目,而不是全部到內存中)以兼容Python 2和Python 3?

回答

89

在Python 2.x中 - .items()返回(鍵,值)對的列表。在Python 3.x中,.items()現在是一個itemview對象,它的行爲不同 - 因此需要迭代或物化......因此,是Python 2.x中dict.items()的必需對象。

的Python 2.7也有一個有點背口密鑰處理的,因爲你有viewkeysviewitemsviewvalues方法,最有用的是viewkeys其行爲更像是一個set(你會從dict期待)。

簡單的例子:

common_keys = list(dict_a.viewkeys() & dict_b.viewkeys()) 

會給你常用鍵的列表,但同樣,在Python 3.x的 - 只需使用.keys()代替。

的Python 3.x中已普遍取得更「懶」 - 即map現在是有效itertools.imapzipitertools.izip

53

dict.iteritems被刪除,因爲dict.items現在做的東西dict.iteritems在Python 2.x的那樣,甚至使它成爲一個itemview提高了一點。

5

至於python 2python 3字典文件會告訴你,在蟒蛇2 items返回一個列表,而iteritems返回一個迭代器。

在python 3中,items返回view,這與迭代器幾乎相同。

如果您正在使用python 2,您可能需要用戶,如果你正在處理大型辭書iteritems,所有你想要做的是在項目迭代(不一定將它們複製到一個列表)

+0

我明白''iteritems''是一個迭代器,這就是爲什麼它非常有用。我幾乎從不想將字典作爲列表迭代。那麼用什麼生成器像Python 2和3兼容的方式迭代字典的正確方法是什麼? – user248237dfsf

+2

@ user248237'對於some_dict中的鍵''對兩個都有效 - '2to3'工具會將'iteritems()'翻譯爲'items()'無論如何...... –

+1

@JonClements:儘管我一直認爲「在d:d [k]中的k是不必要的冗長/不合理的 – user248237dfsf

2

正如@Wessie注意到,dict.iteritemsdict.iterkeysdict.itervalues(其在Python2.x返回一個迭代)以及dict.viewitemsdict.viewkeysdict.viewvalues和(返回視圖對象在Python2.x)在Python3.x

被全部去除

dict.itemsdict.keys和用於返回字典在Python2.x列表的副本現在回到視圖對象Python3.xdict.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'> 
3

你不能在所有的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

38

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) 
相關問題