programing

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

iphone6s 2023. 5. 7. 11:15
반응형

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)

파이썬 3에서는dict.keys()method는 집합 역할을 하는 사전 보기 개체를 반환합니다.사전을 직접 반복하면 키도 생성되므로 사전을 목록으로 전환하면 다음과 같은 모든 키 목록이 생성되는 키는 다음과 같습니다.

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

완전한 대답은 아니지만 아마도 유용한 힌트일 것입니다.만약 그것이 정말로 당신이 원하는 첫번째 아이템이라면*,

next(iter(q))

보다 훨씬 빠릅니다.

list(q)[0]

전체를 메모리에 저장할 필요가 없기 때문에 대용량 딕트의 경우.

10,000,000개의 항목에 대해 거의 40,000배 더 빠르다는 것을 알게 되었습니다.

* Python 3.6 이전에 딕트가 단지 의사 무작위 항목일 경우의 첫 번째 항목(그 이후에는 표준 구현에서 명령되지만 의존하는 것은 권장되지 않습니다.)

파이썬 3

mydict = {'a': 'one', 'b': 'two', 'c': 'three'}
mykeys = [*mydict]          #list of keys
myvals = [*mydict.values()] #list of values

print(mykeys)
print(myvals)

산출량

['a', 'b', 'c']
['one', 'two', 'three']

또한 이 자세한 답변을 참조하십시오.

저는 첫 번째 사전 항목의 "키"와 "값" 쌍을 원했습니다.저는 다음 코드를 사용했습니다.

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

호출하는 대신 사전 키(첫 번째 키뿐만 아니라)를 잘라야 하는 경우list()test를 사용하여 마크의 답변에 있는 방법을 일반화합니다.islice붙박이로itertools모듈.

from itertools import islice
# slice test.keys from index l to index u
some_keys = list(islice(test, l, u))

사전의 크기에 상대적인 슬라이스의 크기에 따라 이 방법은 다음보다 50% ->40000배 더 빠릅니다.

list(test)[l:u]

예를 들어, 아래 예제에서는 >43000배 더 빠릅니다.

n = 10_000_000
test = dict(zip(range(n), [0,1,2,3,4]*(n//5)))

%timeit list(islice(test, 10, 30))
# 4.43 µs ± 193 ns per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit list(test)[10:30]
# 192 ms ± 2.65 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
test = {'foo': 'bar', 'hello': 'world'}
ls = []
for key in test.keys():
    ls.append(key)
print(ls[0])

정적으로 정의된 목록에 키를 추가한 다음 해당 목록에 대해 색인화하는 일반적인 방법

대부분의 경우 XY 문제일 수 있습니다.사전 키를 위치별로 인덱싱하는 이유는 무엇입니까?꼭 그렇게 해야 하나요?최근까지 사전은 Python으로 주문되지도 않았기 때문에 첫 번째 요소에 액세스하는 것은 임의적이었습니다.

나는 방금 파이썬 2 코드를 파이썬 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

반응형