İtems () yerine iteritems () ne zaman kullanılmalıdır?


153

Kullanımı meşru mı items()yerine iteritems()her yerde? iteritems()Python 3'ten neden kaldırıldı? Müthiş ve kullanışlı bir yöntem gibi görünüyor. Arkasındaki sebep nedir?

Düzenleme: Açıklığa kavuşturmak için, hem Python 2 hem de Python 3 ile uyumlu bir şekilde bir sözlük üzerinde jeneratör benzeri bir şekilde (her seferinde bir öğe, tüm belleğe değil) yineleme için doğru deyimin ne olduğunu bilmek istiyorum ?

Yanıtlar:


148

Python 2.x içinde - .items()(anahtar, değer) çiftlerinin bir listesini döndürdü. Python 3.x olarak, .items()bir anda itemviewfarklı davranır nesne, - bu yüzden vardır ... So iterated veya hayata geçirilmesinde, list(dict.items())ne için gereklidir dict.items()Python 2.x

Python 2.7 Ayrıca sahip olmasıyla, anahtar kullanım için bir arka limanın biraz vardır viewkeys, viewitemsve viewvaluesyöntemleri, en yararlı olmak viewkeysdaha bir gibi davranır set(bir bekleyebileceğiniz hangi dict).

Basit örnek:

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

Ortak tuşların bir listesini verecektir, ancak yine Python 3.x'te - .keys()bunun yerine kullanın.

Python 3.x genellikle daha "tembel" hale getirildi - yani mapartık etkili itertools.imap, zipöyle itertools.izipvs.


96

dict.iteritemskaldırıldı çünkü dict.itemsşimdi bir şey dict.iteritemspython 2.x yaptı ve hatta bir yaparak biraz geliştirdi itemview.


64

Altı kütüphane , hem python 2.5+ hem de python 3 ile uyumlu kod yazma konusunda yardımcı olur. Hem python 2 hem de 3'te çalışacak bir iteritems yöntemine sahiptir. Örnek:

import six

d = dict( foo=1, bar=2 )

for k, v in six.iteritems(d):
    print(k, v)

9

Python 2 ve python 3 için sözlük belgelerinin size söyleyeceği gibi, python 2'de itemsbir liste iteritemsdöndürürken bir yineleyici döndürür.

Python 3'te, yineleyici ile hemen hemen aynı olan itemsbir görünüm döndürür .

Python 2 kullanıyorsanız, iteritemsbüyük sözlüklerle uğraşıyorsanız ve yapmak istediğiniz tek şey öğeler üzerinde tekrarlamaktır (bunları bir listeye kopyalamanız gerekmez)


Bunun iteritemsbir yineleyici olduğunu anlıyorum , bu yüzden çok kullanışlı. Neredeyse hiçbir zaman bir sözlük üzerinden liste olarak yinelemek istemiyorum. Python 2 ve 3 ile uyumlu bir şekilde jeneratör gibi sözlük üzerinde yinelemenin doğru yolu nedir?

3
@ user248237 for key in some_dicther ikisi de üzerinde çalışır - ve 2to3araç yine de tercüme iteritems()edecek items()...
Jon Clements

1
@JonClements: yeterince adil, her zaman for k in d: d[k]gereksiz yere ayrıntılı / unpythonic olduğunu düşündüm

6

@Wessie belirtildiği gibi, dict.iteritems, dict.iterkeysve dict.itervalues(bir geri dönme yineleyici Python2.x) iyi olarak dict.viewitems, dict.viewkeysve dict.viewvalues(dönüş olan görünüşüdür nesneleri Python2.x olarak) tüm Python3.x çıkarıldı

Ve dict.items, dict.keysve dict.valuesbir dönüş için kullanılan kopyasını şimdi Python2.x içinde Sözlüğün listesinin dönmek görünüm nesneleri Python3.x içinde, ama onlar hala aynı değildir Yineleyici .

Python3.x içinde bir yineleyici döndürmek istiyorsanız , şunu kullanın 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'>

Ters bir arama yapmak istediğinde hangisi daha etkilidir? nesne veya yineleyici görüntülemek?
cankurtaran

6

Bunun itemsyerine iteritemsPython'daki tüm yerlerde kullanamazsınız . Örneğin, aşağıdaki kod:

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)]

kullanırsanız kırılacaktır 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'

Aynı şey Python 3'te bulunan görünüm öğeleri için de geçerlidir .

Ayrıca, öğeler sözlüğün (key, value)çiftler listesinin bir kopyasını döndürdüğü için , yine de bir kopya oluşturmak istemediğiniz sürece daha az verimlidir.

Python 2'de iteritemsyineleme için kullanmak en iyisidir . 2to3Aracı ile değiştirebilirsiniz itemsHiç Python 3'e yükseltmek isterseniz.


0

future.utils python 2 ve 3 uyumluluğuna izin verir

# 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)

https://python-future.org/compatible_idioms.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.