programing

항목() 대신 반복 항목()을 사용해야 하는 경우는 언제입니까?

stoneblock 2023. 5. 19. 23:58

항목() 대신 반복 항목()을 사용해야 하는 경우는 언제입니까?

사용하는 것이 합법적입니까?items()iteritems()모든 곳에서?왜 그랬을까요?iteritems()Python 3에서 제거하시겠습니까?훌륭하고 유용한 방법인 것 같습니다.그 배경에는 어떤 이유가 있습니까?

편집: 명확하게 하기 위해 사전을 생성기와 같은 방식으로(모두 메모리로가 아닌) Python 2와 Python 3 모두와 호환되는 방식으로 반복하기 위한 올바른 관용구가 무엇인지 알고 싶습니다.

Python 2.x - (키, 값) 쌍 목록을 반환했습니다.Python 3.x에서는 이제itemview객체, 다르게 동작합니다. 따라서 반복하거나 구체화해야 합니다.그렇게,list(dict.items()) was 것필니요다합에이전의▁합니다.dict.items()Python 2.x 버전.

또한 Python 2.7은 키 처리를 위한 약간의 백포트를 가지고 있는데, 이는 당신이 , 그리고 메소드를 가지고 있다는 점에서, 가장 유용한 것입니다.viewkeys그것은 좀 더 a처럼 행동합니다.set것요.dict).

간단한 예:

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

키 에서는 그냥 공키통목제공만지, 파썬에 3.x는서다 - 사니합용그를 합니다..keys()대신.

Python 3.x는 일반적으로 더 "느리게" 만들어졌습니다. 즉, 이제 효과적으로, is, 등입니다.

dict.iteritems다음 이유로 제거되었습니다.dict.items이제 문제가 해결되었습니다.dict.iteritemspython 2.x에서 했고 심지어 그것을 a로 만듦으로써 그것을 약간 개선했습니다.

6개의 라이브러리는 python 2.5+와 python 3 모두와 호환되는 코드를 작성하는 데 도움이 됩니다.Python 2와 3 모두에서 작동하는 반복 항목 방법이 있습니다.예:

import six

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

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

python 2와 python 3에 대한 사전 문서에서 알 수 있듯이 python 2에서는items 반는동안하환목록을동,▁returnsiteritems반복기를 반환합니다.

에서 파썬에 3서이,items반복기와 거의 동일한 보기를 반환합니다.

만약 당신이 python 2를 사용하고 있다면, 당신은 사용하기를 원할 것입니다.iteritems대규모 사전을 처리하는 경우 항목 위에 반복하기만 하면 됩니다(목록에 복사할 필요는 없음).

@ @ 지적듯이했가,dict.iteritems,dict.iterkeys그리고.dict.itervalues(Python2.x에서 반복기를 반환함) 및dict.viewitems,dict.viewkeys그리고.dict.viewvalues(Python2.x에서 객체를 반환함)는 Python3에서 모두 제거되었습니다.x

그리고.dict.items,dict.keys그리고.dict.valuesPython2.x에서 사전 목록의 복사본을 반환하는 데 사용되었지만 Python3.x에서 보기 개체를 반환하지만 여전히 반복기와 같지는 않습니다.

Python 3.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'>

사용할 수 없습니다.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'

Python 3에서 사용할 수 있는 보기 항목도 마찬가지입니다.

또한 항목이 사전의 목록 복사본을 반환하기 때문에(key, value)복사본을 생성하지 않는 한 효율성이 떨어집니다.

Python 2에서 사용하는 것이 가장 좋습니다.iteritems반복하기 위해2to3도구가 그것을 대체할 수 있습니다.itemsPython 3으로 업그레이드하기로 결정한 경우.

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)

다음 링크를 참조하십시오. https://python-future.org/compatible_idioms.html

어떤 이유로든 여전히 이 작업을 수행해야 하고 호환성 라이브러리를 사용하지 않으려는 경우 간단한 방법은 버전별로 올바른 호출을 호출하는 최상위 호출을 만드는 것입니다.

from operator import methodcaller
try:
    {}.viewitems()
except AttributeError:
    # Py3, use items
    viewitems = methodcaller('items')
else:
    viewitems = methodcaller('viewitems')

mydict = {...}
for k, v in viewitems(mydict):
    ...

이것은 2.7과 3+에서 동일하게 동작합니다(복사하지 않고 항상 실시간 보기를 얻습니다).모든 참조를 다음으로 변경할 수 있습니다.view부터view로.iter2.7 이전 버전의 Python을 지원하지만 경우에 따라 동작이 미묘하게 다를 수 있습니다(뷰는 반복적이지만 반복자는 아닙니다. 호출할 수 있습니다.next반복기(반복기는 아니지만 반복기가 아닌 경우.

하지만 실제로는:

  1. 이 시점에서 Py2는 EOL이므로 Py3에 대해 쓰기만 하면 됩니다.
  2. 다 Py2에 대해 한 한 한 한 쓰십시오( " " " " ", " " Py2" " " 를 합니다.__future__ 파일 이름, 파일 이름u그리고.b대 , io.openopen 및 ①)을 사용합니다.2to3직접적으로 휴대용으로 쓸 수 없는 사소한 것들을 위해.

언급URL : https://stackoverflow.com/questions/13998492/when-should-iteritems-be-used-instead-of-items