나는 다음 코드에 의문을 품는다.
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
print key, 'corresponds to', d[key]
내가 이해할 수없는 부분은 key
부분입니다. 파이썬은 사전에서 키를 읽는 것만을 필요로한다는 것을 어떻게 인식합니까? key
name__은 (는) 파이썬에서 특별한 단어입니까? 아니면 단순히 변수입니까?
key
은 변수 이름입니다.
for key in d:
키와 값이 아닌 사전의 키를 반복하면됩니다. 키와 값을 반복하려면 다음을 사용할 수 있습니다.
Python 2.x :
for key, value in d.iteritems():
Python 3.x :
for key, value in d.items():
자신을 테스트하려면 Word key
을 poop
으로 변경하십시오.
파이썬 3.x에서, iteritems()
은 단순히 items()
으로 대체되었으며, 이것은 딕셔너리에 의해 뒷받침되는 iteritems()
처럼 집합적인 뷰를 반환하지만 더 좋을 수도 있습니다. 2.7에서 viewitems()
로도 사용할 수 있습니다.
items()
연산은 2와 3 모두에서 작동하지만 2에서는 (key, value)
쌍의 목록을 반환하며 items()
호출 이후에 발생하는 dict의 변경 사항을 반영하지 않습니다. 3.x에서 2.x 동작을 원한다면 list(d.items())
을 호출 할 수 있습니다.
특별한 단어는 그 열쇠가 아니지만 그 사전은 반복자 프로토콜을 구현합니다. 수업에서이 작업을 수행 할 수 있습니다 (예 : 클래스 이터레이터를 만드는 방법은 이 질문 을 참조하십시오.
사전의 경우 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()
의 줄임말입니다.
Python 3에서 dict.iterkeys()
, dict.itervalues()
및 dict.iteritems()
은 더 이상 지원되지 않습니다. 대신 dict.keys()
, dict.values()
및 dict.items()
을 사용하십시오.
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)]
이것은 튜플 목록을 제공합니다. 이와 같이 반복하면 각 튜플은 자동으로 k
및 v
에 압축이 풀립니다.
for k,v in d.items():
print(k, 'corresponds to', v)
k
을 반복 할 때 변수 이름으로 v
및 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))
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)
for .. in ..
- 구문을 사용하여 사전을 반복 할 때 항상 키를 반복합니다 (값은 dictionary[key]
를 사용하여 액세스 할 수 있음).
키 - 값 쌍을 반복하려면 for k,v in s.iteritems()
을 사용하십시오.
이것은 매우 일반적인 루핑 관용구입니다. in
은 연산자입니다. for key in dict
를 사용해야하는 경우와 for key in dict.keys()
일 필요가있는 경우, David Goodger의 관용적 인 Python 기사 를 참조하십시오.
이것을 사용할 수 있습니다 :
for key,val in d.items():
print key, 'is the key for ', val
나는 키, 값 쌍, 또한 내가 어디에 있는지를 나타내는 인덱스를 얻기 위해 사전을 반복해야만하는 유스 케이스가있다. 이것이 내가하는 일이다.
d = {'x': 1, 'y': 2, 'z': 3}
for i, (key, value) in enumerate(d.items()):
print(i, key, value)
키 주변의 괄호 값은 중요하며 괄호 없이는 ValueError가 "압축 할 값이 충분하지 않습니다."라는 것을 알 수 있습니다.
오늘, 파이썬 2.6과 2.7, 그리고 3.x는 모두 내 상자에서 items()
과 잘 작동합니다 :
z = {0: 'a', 1: 'b'}
for k, v in z.items(): print(v, k)
'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']
파이썬이 반복하는 방식은 필요한 컨텍스트에서 iterator (이 경우 keyiterator 객체)를 반환하는 객체의 __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
값을 반복하고 싶다면 딕셔너리의 .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)
키를 반복 할 때는 느리지 만 my_dict.keys()
을 사용하는 것이 좋습니다. 다음과 같이하면 :
for key in my_dict:
my_dict[key+"-1"] = my_dict[key]-1
프로그램이 실행되는 동안 키를 변경하기 때문에 런타임 오류가 발생합니다. 시간을 줄이기 위해 절대적으로 설정되어 있다면 for key in my_dict
방법을 사용하되 경고를 받았다.).
My_dict의 key는 my_dict.keys ()의 key와 실제로 같습니다. 그래서 당신이 dict의 가치를 얻길 원한다면 두 가지 방법을 시도 할 수 있습니다.
하나:
for value in my_dict.values():
print(value)
두:
for key in my_dict:
print(my_dict[key])
긴 값에 대한 제안 인쇄
값에 긴 문자열이 있으면 읽을 수있는 형식으로 이것을 더 빨리 인쇄 할 수 있습니다.for key, value in my_dictionary.iteritems(): print(key) print("---------") print(value) print("\n")