'for'루프를 사용하여 사전을 반복


3138

나는 다음 코드에 약간 당황했다.

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

내가 이해하지 못하는 것은 key부분입니다. 파이썬은 사전에서 키를 읽기만하면된다는 것을 어떻게 인식합니까? 가 key파이썬에서 특별한 단어는? 아니면 단순히 변수입니까?


3
새 답변을 게시하기 전에이 질문에 대한 답변이 10 개 이상 있다고 생각하십시오. 귀하의 답변이 기존 답변에 속하지 않은 정보를 제공하는지 확인하십시오.
janniks

답변:


5392

key 변수 이름입니다.

for key in d:

단순히 키와 값이 아닌 사전의 키를 반복합니다. 키와 값을 모두 반복하려면 다음을 사용할 수 있습니다.

Python 3.x의 경우 :

for key, value in d.items():

Python 2.x의 경우 :

for key, value in d.iteritems():

자신을 테스트하려면 단어 key를로 변경하십시오 poop.

Python 3.x에서는 iteritems()간단하게 대체되어 items()dict로 뒷받침되는 세트와 같은 뷰를 반환 iteritems()하지만 더 좋습니다. 이것은 2.7에서로도 제공됩니다 viewitems().

이 작업 items()은 2와 3 모두에서 작동하지만 2에서는 사전 (key, value)쌍 의 목록을 반환하며 items()호출 후 발생하는 딕트의 변경 사항을 반영하지 않습니다 . 3.x에서 2.x 동작을 원하면을 호출 할 수 있습니다 list(d.items()).


158
다음과 같은 값에 액세스하지 않는 간과 된 이유를 추가하면 for 루프 내부에 d [key]가 키를 다시 해시하여 값을 얻습니다. 사전이 크면이 추가 해시가 전체 시간에 추가됩니다. 이에 대한 내용은 Raymond Hettinger의 기술 강연 youtube.com/watch?v=anrOzOapJ2E
quiet_penguin

27
항목이 예측할 수없는 순서로 반복되며 sorted안정화 하기 위해 필요하다는 것을 언급하는 것이 합리적 일 수 있습니다.
yugr

5
@HarisankarKrishnaSwamy 대안은 무엇입니까?
JoeyC

3
@yugr 왜 그렇게 말합니까? 문서는 말한다 Keys and values are iterated over in insertion order. [ docs.python.org/3/library/…
Geza Turi

4
@yugr Python 3.7부터 사전은 삽입 순서이며 언어 기능입니다.
Aimery

432

키가 특별한 단어는 아니지만 사전은 반복자 프로토콜을 구현합니다. 클래스 에서이 작업을 수행 할 수 있습니다. 예를 들어 클래스 반복자를 작성하는 방법에 대해서는 이 질문 을 참조하십시오 .

사전의 경우 C 수준에서 구현됩니다. 자세한 내용은 PEP 234에 나와 있습니다. 특히 "사전 반복자"섹션은 다음과 같습니다.

  • 사전은 사전의 키를 반복하는 효율적인 반복자를 리턴하는 tp_iter 슬롯을 구현합니다. [...] 이것은 우리가 쓸 수 있음을 의미합니다

    for k in dict: ...

    어느 것보다 훨씬 빠르지 만

    for k in dict.keys(): ...

    루프 또는 다른 스레드에 의한 사전 수정에 대한 제한이 위반되지 않는 한.

  • 다른 종류의 반복자를 명시 적으로 리턴하는 메소드를 사전에 추가하십시오.

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...

    이것은 for x in dict약칭을 의미합니다 for x in dict.iterkeys().

파이썬 3에서 dict.iterkeys(), dict.itervalues()그리고 dict.iteritems()더 이상 지원되지 않습니다. 사용 dict.keys(), dict.values()그리고 dict.items()대신.


207

이상 반복 dict당신이 여기에서 볼 수 있듯이, 특별한 순서의 키를 반복을 :

편집 : ( Python3.6 에서는 더 이상 그렇지 않지만 아직 동작이 보장되지는 않습니다.)

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

예를 들어 다음을 사용하는 것이 좋습니다 dict.items().

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

튜플 목록이 제공됩니다. 때 같은 그들에 당신은 루프, 각 튜플에 압축을 푼입니다 kv자동 :

for k,v in d.items():
    print(k, 'corresponds to', v)

루프의 본문이 단지 몇 줄이면 A를 반복 할 때 kv변수 이름을 사용 하는 dict것이 일반적입니다. 더 복잡한 루프의 경우 더 설명적인 이름을 사용하는 것이 좋습니다.

for letter, number in d.items():
    print(letter, 'corresponds to', number)

형식 문자열을 사용하는 습관을들이는 것이 좋습니다.

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))

11
Python 3.7 릴리스 정보 : "dict 객체의 삽입 순서 보존 특성은 이제 Python 언어 사양의 공식 부분입니다."
그레고리 아 레니 우스

86

key 단순히 변수입니다.

대한 Python2.X :

d = {'x': 1, 'y': 2, 'z': 3} 
for my_var in d:
    print my_var, 'corresponds to', d[my_var]

... 또는 더 나은

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

대한 Python3.X :

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)

63

for .. in ..-syntax를 사용하여 사전을 반복 할 때는 항상 키를 반복합니다 (값은을 사용하여 액세스 가능 dictionary[key]).

키-값 쌍을 반복하려면 Python 2 for k,v in s.iteritems()및 Python 3을 사용하십시오 for k,v in s.items().


38
Python 3의 경우 items()대신iteritems()
Andreas Fester


19

'for'루프를 사용하여 사전을 반복

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    ...

파이썬은 사전에서 키를 읽기만하면된다는 것을 어떻게 인식합니까? 파이썬에서 키가 특별한 단어입니까? 아니면 단순히 변수입니까?

단지 for루프 가 아닙니다 . 여기서 중요한 단어는 "경험"입니다.

사전은 키를 값에 매핑하는 것입니다.

d = {'x': 1, 'y': 2, 'z': 3} 

반복 할 때마다 키를 반복합니다. 변수 이름 key은 설명을위한 것일 뿐이며 목적에 매우 적합합니다.

이것은 목록 이해에서 발생합니다.

>>> [k for k in d]
['x', 'y', 'z']

사전을 목록 (또는 다른 컬렉션 유형 객체)에 전달하면 발생합니다.

>>> list(d)
['x', 'y', 'z']

파이썬이 반복하는 방식은 필요한 컨텍스트에서 __iter__반복자 (이 경우 키 이터레이터 객체)를 반환하는 객체 (이 경우 사전) 의 메소드를 호출합니다 .

>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>

우리는 이러한 특수 메소드를 직접 사용하지 말고 각각의 내장 함수를 사용하여 호출하십시오 iter.

>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>

반복자에는 __next__메소드가 있지만 내장 함수로 호출합니다 next.

>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

반복자가 소진되면을 올립니다 StopIteration. 이것은 파이썬이 for루프, 목록 이해, 생성기 표현식 또는 다른 반복 컨텍스트 를 종료하는 방법을 알고 있습니다. 반복자가 StopIteration올린 후에는 항상 올립니다. 다시 반복하려면 새로운 반복자가 필요합니다.

>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']

딕 트로 돌아 가기

우리는 많은 상황에서 반복되는 구술을 보았습니다. 우리가 본 것은 dict을 반복 할 때마다 열쇠를 얻는다는 것입니다. 원래 예제로 돌아 가기 :

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:

변수 이름을 변경해도 여전히 키를 얻습니다. 해 보자:

>>> for each_key in d:
...     print(each_key, '=>', d[each_key])
... 
x => 1
y => 2
z => 3

값을 반복하려면 .valuesdicts 방법 을 사용 하거나 둘 다 함께 사용해야합니다 .items.

>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]

주어진 예제에서 다음과 같은 항목을 반복하는 것이 더 효율적입니다.

for a_key, corresponding_value in d.items():
    print(a_key, corresponding_value)

그러나 학문적 목적으로 질문의 예는 괜찮습니다.


17

dict을 통해 키, 값 쌍 및 위치를 나타내는 인덱스를 가져와야하는 유스 케이스가 있습니다. 이것이 내가하는 방법입니다.

d = {'x': 1, 'y': 2, 'z': 3} 
for i, (key, value) in enumerate(d.items()):
   print(i, key, value)

키를 둘러싼 괄호, 값은 중요합니다. 괄호가 없으면 "포장 할 값이 충분하지 않습니다"라는 ValueError가 발생합니다.


1
이것이 질문과 어떤 관련이 있습니까?
jorijnsmit

8

dicttypeGitHub 에서 CPython의 구현을 확인할 수 있습니다 . 이것은 dict 반복자를 구현하는 메소드의 서명입니다.

_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
             PyObject **pvalue, Py_hash_t *phash)

CPython dictobject.c


4

키를 반복하려면 속도가 느리지 만 사용하는 것이 좋습니다 my_dict.keys(). 다음과 같이하려고하면 :

for key in my_dict:
    my_dict[key+"-1"] = my_dict[key]-1

프로그램이 실행되는 동안 키를 변경하기 때문에 런타임 오류가 발생합니다. 시간 단축을 절대적으로 설정했다면 그 for key in my_dict방법을 사용하십시오 .


2

그러면 오름차순으로 값별로 정렬 된 순서대로 출력이 인쇄됩니다.

d = {'x': 3, 'y': 1, 'z': 2}
def by_value(item):
    return item[1]

for key, value in sorted(d.items(), key=by_value):
    print(key, '->', value)

산출:

여기에 이미지 설명을 입력하십시오

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