답변:
Python 2.x에서- .items()
(키, 값) 쌍의 목록을 반환했습니다. 파이썬 3.x의에서 .items()
지금 itemview
다른 동작 객체는 - 그렇게 가지고 ... 그래서를 통해 반복, 또는 구체화 할, list(dict.items())
무슨 필요 dict.items()
파이썬 2.x 또는 3.0에
파이썬 2.7에는 키 처리를위한 약간의 백 포트가 viewkeys
있으며 viewitems
, viewvalues
메소드 viewkeys
는 set
( 와 같은 것으로 예상되는 dict
) 가장 유용한 것 입니다.
간단한 예 :
common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())
일반적인 키 목록을 제공하지만 Python 3.x에서는 다시 사용하십시오 .keys()
. 대신 사용하십시오.
파이썬 3.x는 일반적으로 더 "게으른"것으로 만들어졌습니다. 즉 , map
이제는 효과적으로 itertools.imap
, zip
is itertools.izip
등입니다.
6 개의 라이브러리 는 python 2.5 이상 및 python 3과 호환되는 코드 작성에 도움이됩니다.
import six
d = dict( foo=1, bar=2 )
for k, v in six.iteritems(d):
print(k, v)
파이썬 2 와 파이썬 3 의 사전 문서에서 알 수 있듯이 파이썬 2 items
에서는 목록을 iteritems
반환하고 반복자는 반환합니다.
파이썬 3에서는 반복자와 거의 같은 view를items
반환 합니다.
python 2를 사용하는 iteritems
경우 큰 사전을 다루는 경우 사용자 에게 원할 수 있으며 원하는 것은 항목을 반복하는 것입니다 (목록에 반드시 복사 할 필요는 없음).
for key in some_dict
둘 다에 작동-그리고 2to3
도구는 어쨌든 번역 iteritems()
됩니다 items()
...
@Wessie가 주목 것처럼 dict.iteritems
, dict.iterkeys
및 dict.itervalues
(AN 반환하는 반복자 Python2.x하여)뿐만 아니라 dict.viewitems
, dict.viewkeys
및 dict.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'>
파이썬의 모든 곳에서 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로 업그레이드하기로 결정한 경우.
future.utils는 파이썬 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)
iteritems
그것이 반복 자라는 것을 이해 하므로 그것이 매우 유용합니다. 나는 사전을 목록으로 반복하고 싶지 않습니다. 그렇다면 Python 2 및 3과 호환되는 방식으로 생성기를 사용하여 사전을 반복하는 올바른 방법은 무엇입니까?