[python] 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]

모든 것을 메모리에 저장할 필요가 없기 때문에 큰 dicts의 경우.

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

* dict이 파이썬 3.6 이전의 의사 난수 항목 인 경우 첫 번째 항목 은 표준 구현에서 주문되지만 의존하지 않는 것이 좋습니다.


답변

첫 번째 사전 항목의 “키”및 “값”쌍을 원했습니다. 다음 코드를 사용했습니다.

 key, val = next(iter(my_dict.items()))


답변

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

정적으로 정의 된 목록에 키를 추가 한 다음 동일한 색인을 생성하는 기존의 방법


답변

많은 경우에 이것은 XY 문제 일 수 있습니다 . 위치별로 사전 키를 색인화하는 이유는 무엇입니까? 정말로해야합니까? 최근까지 파이썬에서는 사전을 주문하지 않았으므로 첫 번째 요소에 액세스하는 것은 임의적이었습니다.

방금 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):

잘 작동합니다.

다른 많은 경우에는 위치별로 사전 키 인덱싱을 피할 수 있다고 생각합니다. 파이썬 3.7에서 사전이 주문되었지만 그것에 의존하는 것은 그리 좋지 않습니다. 위의 코드는의 콘텐츠 some_list가 최근의 콘텐츠로 제작 되었기 때문에 작동합니다 d.

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


답변

이 시도

keys = [next(iter(x.keys())) for x in test]
print(list(keys))

결과는 다음과 같습니다. [ ‘foo’, ‘hello’]

더 많은 솔루션을 여기에서 찾을 수 있습니다 .


답변