etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 10. 5. 04:43
반응형

질문자 :TopChef


나는 다음 코드에 약간 의아해합니다.

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

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



key 는 변수 이름일 뿐입니다.

 for key in d:

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

Python 3.x의 경우:

 for key, value in d.items():

Python 2.x의 경우:

 for key, value in d.iteritems():

직접 테스트하려면 단어 keypoop 변경하십시오.

파이썬 3.x의에서 iteritems() 단순히으로 대체 된 items() 반환 세트 같은처럼 DICT의 지원보기 iteritems() 더 나은하지만. viewitems() 로 사용할 수 있습니다.

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


sberry

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

사전의 경우 C 수준에서 구현됩니다. 자세한 내용은 PEP 234 에서 확인할 수 있습니다. 특히 "Dictionary Iterators" 섹션은 다음과 같습니다.

  • 사전은 사전의 키를 반복하는 효율적인 반복자를 반환하는 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 dictfor x in dict.iterkeys() 축약형임을 의미합니다.

Python 3에서 dict.iterkeys() , dict.itervalues()dict.iteritems() 는 더 이상 지원되지 않습니다. 대신 dict.keys() , dict.values()dict.items() 사용하십시오.


ars

dict 반복은 여기에서 볼 수 있듯이 특정 순서 없이 키를 반복합니다.

( Python 3.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)

dict kv 를 변수 이름으로 사용하는 것은 루프의 본문이 몇 줄에 불과한 경우 매우 일반적입니다. 더 복잡한 루프의 경우 더 설명적인 이름을 사용하는 것이 좋습니다.

 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))

John La Rooy

key 는 단순히 변수입니다.

Python2.X의 경우 :

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

... 또는 더 나은,

 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)

ssoler

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

키-값 쌍을 반복하려면 Python 2 for k,v in s.iteritems() for k,v in s.items() Python 3을 사용합니다.


Alexander Gessler

이것은 매우 일반적인 루핑 관용구입니다. in 은 연산자입니다. for key in dict 를 사용해야 for key in dict.keys() 사용해야 하는 경우 는 David Goodger의 Idiomatic Python 기사(보관된 사본)를 참조하십시오 .


chryss

'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']

Python이 반복하는 방식은 필요한 컨텍스트에서 반복자(이 경우 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']

딕셔너리로 돌아가기

우리는 많은 컨텍스트에서 반복되는 dicts를 보았습니다. 우리가 본 것은 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 dicts의 방법을, 또는 둘 모두 서로에 대한 .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)

그러나 학문적 목적을 위해 질문의 예는 괜찮습니다.


Aaron Hall

키, 값 쌍, 현재 위치를 나타내는 인덱스를 얻기 위해 dict를 반복해야 하는 사용 사례가 있습니다. 이것이 내가하는 방법입니다.

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

키, 값 주위의 괄호가 중요합니다. 괄호가 없으면 "압축을 풀기에 값이 충분하지 않음" ValueError


jdhao

GitHub dicttype 구현을 확인할 수 있습니다. 이것은 dict iterator를 구현하는 메소드의 서명입니다:

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

CPython dictobject.c


Ankur Agarwal

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

 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)

산출:

 y -> 1 z -> 2 x -> 3

Amar Kumar

키를 반복하려면 느리지만 my_dict.keys() 를 사용하는 것이 좋습니다. 다음과 같은 작업을 시도한 경우:

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

프로그램이 실행되는 동안 키를 변경하기 때문에 런타임 오류가 발생합니다. 절대적으로 시간을 줄이려는 경우 my_dict 방식으로 for key in my_dict


Neil Chowdhury o_O

명확하고 시각적인 예를 찾고 있다면:

 cat = {'name': 'Snowy', 'color': 'White' ,'age': 14} for key , value in cat.items(): print(key, ': ', value)

결과:

 name: Snowy color: White age: 14

Mister Verleg

바로 요점으로 들어가 보겠습니다. key 라는 단어가 단지 변수일 경우 언급했듯이 사전에 'FOR LOOP' 를 실행하면 'keys' 만 실행되고 'values' 는 무시됩니다.

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

오히려 이것을 시도하십시오 :

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

그러나 다음과 같은 기능을 사용하는 경우:

 d = {'x': 1, 'y': 2, 'z': 3} print(d.keys())

위의 경우 'keys' 는 변수가 아니라 함수입니다.


Rohit_VE

출처 : 여기를 클릭하세요


출처 : http:www.stackoverflow.com/questions/3294889/iterating-over-dictionaries-using-for-loops

반응형