program tip

Python3에서 인덱스로 dict_keys 요소에 액세스

radiobox 2020. 8. 18. 07:31
반응형

Python3에서 인덱스로 dict_keys 요소에 액세스


인덱스로 dict_key의 요소에 액세스하려고합니다.

test = {'foo': 'bar', 'hello': 'world'}
keys = test.keys()  # dict_keys object

keys.index(0)
AttributeError: 'dict_keys' object has no attribute 'index'

나는 얻고 싶다 foo.

와 같다:

keys[0]
TypeError: 'dict_keys' object does not support indexing

어떻게 할 수 있습니까?


list()대신 사전을 호출 하십시오.

keys = list(test)

Python 3에서 dict.keys()메서드는 집합 역할을하는 사전 뷰 객체를 반환합니다 . 사전을 직접 반복하면 키도 생성되므로 사전을 목록으로 바꾸면 모든 키 목록이 생성됩니다.

>>> test = {'foo': 'bar', 'hello': 'world'}
>>> list(test)
['foo', 'hello']
>>> list(test)[0]
'foo'

완전한 대답은 아니지만 유용한 힌트 일 것입니다. 정말로 원하는 첫 번째 항목 *이라면

next(iter(q))

보다 훨씬 빠릅니다

list(q)[0]

큰 딕셔너리의 경우 모든 것이 메모리에 저장 될 필요가 없기 때문입니다.

10.000.000 항목의 경우 거의 40.000 배 더 빠릅니다.

* 딕셔너리가 파이썬 3.6 이전의 의사 난수 항목 인 경우의 첫 번째 항목 (그 이후에는 표준 구현에서 주문되지만 의존하지 않는 것이 좋습니다).


test = {'foo': 'bar', 'hello': 'world'}
ls = []
for key in test.keys():
    ls.append(key)
print(ls[0])

정적으로 정의 된 목록에 키를 추가 한 다음 동일한 항목에 대해 인덱싱하는 일반적인 방법


대부분의 경우 이것은 XY 문제 일 수 있습니다 . 위치별로 사전 키를 인덱싱하는 이유는 무엇입니까? 정말 필요합니까? 최근까지 사전은 Python으로 정렬되지 않았으므로 첫 번째 요소에 액세스하는 것은 임의적이었습니다.

방금 Python 2 코드를 Python 3으로 번역했습니다.

keys = d.keys()
for (i, res) in enumerate(some_list):
    k = keys[i]
    # ...

예쁘지는 않지만 나쁘지는 않습니다. 처음에 나는 그것을 괴물로 대체하려고했습니다.

    k = next(itertools.islice(iter(keys), i, None))

이 모든 것이 훨씬 더 잘 작성된다는 것을 깨닫기 전에

for (k, res) in zip(d.keys(), some_list):

잘 작동합니다.

다른 많은 경우에는 위치별로 사전 키를 인덱싱하는 것을 피할 수 있다고 생각합니다. 사전은 Python 3.7에서 정렬되지만 이에 의존하는 것은 예쁘지 않습니다. 위의 코드 some_list는의 내용이의 내용에서 최근에 생성 되었기 때문에 작동합니다 d.

disk_keys인덱스 요소에 액세스해야하는 경우 코드를 자세히 살펴보십시오 . 아마도 당신은 그럴 필요가 없습니다.

참고 URL : https://stackoverflow.com/questions/18552001/accessing-dict-keys-element-by-index-in-python3

반응형