항목() 대신 반복 항목()을 사용해야 하는 경우는 언제입니까?
사용하는 것이 합법적입니까?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.iteritems
python 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.values
Python2.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
도구가 그것을 대체할 수 있습니다.items
Python 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
로.iter
2.7 이전 버전의 Python을 지원하지만 경우에 따라 동작이 미묘하게 다를 수 있습니다(뷰는 반복적이지만 반복자는 아닙니다. 호출할 수 있습니다.next
반복기(반복기는 아니지만 반복기가 아닌 경우.
하지만 실제로는:
- 이 시점에서 Py2는 EOL이므로 Py3에 대해 쓰기만 하면 됩니다.
- 다 Py2에 대해 한 한 한 한 쓰십시오( " " " " ", " " Py2" " " 를 합니다.
__future__
파일 이름, 파일 이름u
그리고.b
대 ,io.open
를open
및 ①)을 사용합니다.2to3
직접적으로 휴대용으로 쓸 수 없는 사소한 것들을 위해.
언급URL : https://stackoverflow.com/questions/13998492/when-should-iteritems-be-used-instead-of-items
'programing' 카테고리의 다른 글
기본 창 앞에 대화 상자를 표시하는 WPF (0) | 2023.05.24 |
---|---|
VB.NET에서 문자열 배열 선언 및 초기화 (0) | 2023.05.19 |
복제 세트 몽고 도커-구성 (0) | 2023.05.19 |
vb.net 에서 dbnull 데이터 처리 (0) | 2023.05.19 |
넷캣을 사용하는 최소 웹 서버 (0) | 2023.05.19 |