items () 대신 iteritems ()를 언제 사용해야합니까?


153

모든 장소에서 사용 items()하는 것이 합법적 iteritems()인가요? 왜 iteritems()파이썬 3에서 제거 되었습니까? 훌륭하고 유용한 방법 인 것 같습니다. 그 뒤에 추론은 무엇입니까?

편집 : 명확히하기 위해 Python 2 및 Python 3과 호환되는 방식으로 사전과 같은 생성기 같은 방식으로 (한 번에 하나의 항목이 아닌 메모리로) 반복하는 올바른 관용구가 무엇인지 알고 싶습니다. ?

답변:


148

Python 2.x에서- .items()(키, 값) 쌍의 목록을 반환했습니다. 파이썬 3.x의에서 .items()지금 itemview다른 동작 객체는 - 그렇게 가지고 ... 그래서를 통해 반복, 또는 구체화 할, list(dict.items())무슨 필요 dict.items()파이썬 2.x 또는 3.0에

파이썬 2.7에는 키 처리를위한 약간의 백 포트가 viewkeys있으며 viewitems, viewvalues메소드 viewkeysset( 와 같은 것으로 예상되는 dict) 가장 유용한 것 입니다.

간단한 예 :

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

일반적인 키 목록을 제공하지만 Python 3.x에서는 다시 사용하십시오 .keys(). 대신 사용하십시오.

파이썬 3.x는 일반적으로 더 "게으른"것으로 만들어졌습니다. 즉 , map이제는 효과적으로 itertools.imap, zipis itertools.izip등입니다.


96

dict.iteritemspython 2.x에서 dict.items한 일을 하기 때문에 제거 dict.iteritems되었으며 심지어 itemview.



9

파이썬 2파이썬 3 의 사전 문서에서 알 수 있듯이 파이썬 2 items에서는 목록을 iteritems반환하고 반복자는 반환합니다.

파이썬 3에서는 반복자와 거의 같은 view를items 반환 합니다.

python 2를 사용하는 iteritems경우 큰 사전을 다루는 경우 사용자 에게 원할 수 있으며 원하는 것은 항목을 반복하는 것입니다 (목록에 반드시 복사 할 필요는 없음).


나는 iteritems그것이 반복 자라는 것을 이해 하므로 그것이 매우 유용합니다. 나는 사전을 목록으로 반복하고 싶지 않습니다. 그렇다면 Python 2 및 3과 호환되는 방식으로 생성기를 사용하여 사전을 반복하는 올바른 방법은 무엇입니까?

3
@ user248237 for key in some_dict둘 다에 작동-그리고 2to3도구는 어쨌든 번역 iteritems()됩니다 items()...
Jon Clements

1
@JonClements : 공정의 충분한, 난 항상 생각하지만이 for k in d: d[k]자세한 불필요하다 / unpythonic

6

@Wessie가 주목 것처럼 dict.iteritems, dict.iterkeysdict.itervalues(AN 반환하는 반복자 Python2.x하여)뿐만 아니라 dict.viewitems, dict.viewkeysdict.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'>

역 조회를 원할 때 어느 것이 더 효율적입니까? 객체 또는 반복자를 봅니까?
lifebalance

6

파이썬의 모든 곳에서 items대신 사용할 수는 없습니다 iteritems. 예를 들어, 다음 코드는

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

다음을 사용하면 중단됩니다 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'

파이썬 3에서 사용할 수있는 viewitems 도 마찬가지입니다 .

또한 항목 은 사전 (key, value)쌍 목록의 사본을 리턴하므로 어쨌든 사본을 작성하지 않으면 효율성이 떨어집니다.

Python 2에서는 iteritems반복 에 사용하는 것이 가장 좋습니다 . 2to3도구로 교체 할 수 있습니다 items당신이 이제까지 파이썬 3로 업그레이드하기로 결정한 경우.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.