python - 찾기 - 파이썬 리스트 안에 딕셔너리




'for'루프를 사용하여 사전에 반복 (8)

나는 다음 코드에 의문을 품는다.

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

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


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

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

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

그것은 단지 루프가 아닙니다. 여기서 중요한 단어는 "반복"입니다.

사전은 키와 값의 매핑입니다.

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

이를 반복 할 때마다 키를 반복합니다. 변수 이름 key 는 설명을 목적으로 한 것이며 의도적으로 사용하기 쉽습니다.

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

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

사전 (또는 다른 콜렉션 유형 객체)을 사전에 전달하면 다음과 같이됩니다.

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

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

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

우리는이 특별한 메소드를 직접 사용해서는 안되며 대신 각각의 내장 함수를 사용하여 호출해야한다.

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

반복자는 __next__ 메쏘드를 가지고 있습니다 - 그러나 우리는 builtin 함수를 사용하여 그것을 호출합니다 :

>>> 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 루프,리스트 이해 또는 생성자 표현, 또는 다른 반복적 인 문맥을 빠져 나가는 것을 알고있는 방법이다. iterator가 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

값을 반복하려면 dicts의 .values 메소드를 사용하거나 두 항목을 함께 .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)

그러나 학업 목적을 위해 질문의 예는 훌륭합니다.


GitHub에서 CPython의 dicttype 구현을 검사 할 수 있습니다. 이것은 dict iterator를 구현하는 메소드의 시그니처입니다.

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

CPython dictobject.c


그 열쇠는 특별한 단어는 아니지만 그 사전은 반복자 프로토콜을 구현합니다. 클래스에서이 작업을 수행 할 수 있습니다 (예 : 클래스 반복자를 작성하는 방법에 대한 이 질문 참조).

사전의 경우 C 레벨에서 구현됩니다. 자세한 내용은 PEP 234를 참조하십시오 . 특히 "사전 반복자"섹션은 다음과 같습니다.

  • 사전은 사전의 키를 반복하는 효율적인 iterator를 리턴하는 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() 축약어입니다.


나는 키, 값 쌍, 또한 내가 어디에 있는지를 나타내는 인덱스를 얻기 위해 사전을 반복해야만하는 유스 케이스가있다. 이것이 내가하는 일이다.

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

키 주위의 괄호 값은 중요하며 괄호 없이는 ValueError가 "압축 할 값이 충분하지 않습니다"라는 것을 알 수 있습니다.


이것을 사용할 수 있습니다 :

for key,val in d.items():
    print key, 'is the key for ', val

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

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

프로그램이 실행되는 동안 키를 변경하기 때문에 런타임 오류가 발생합니다. 시간을 줄이기 for key in my_dict 절대적으로 설정되어 있다면 for key in my_dict 방식으로 for key in my_dict 사용하되 경고를 받았다.).


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)

key 는 단지 변수 이름입니다.

for key in d:

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

Python 2.x :

for key, value in d.iteritems():

파이썬 3.x :

for key, value in d.items():

자신을 테스트하려면 단어 keypoop 변경하십시오.

Python 3.x에서는 iteritems()iteritems() 와 마찬가지로 dict에 의해 뒷받침되는 집합과 같은보기를 반환하는 items() 으로 대체되었습니다. 이는 2.7에서 viewitems() 로도 사용할 수 있습니다.

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





dictionary