programing

유형 오류: 'dict_keys' 개체가 인덱싱을 지원하지 않습니다.

padding 2023. 5. 18. 20:48
반응형

유형 오류: 'dict_keys' 개체가 인덱싱을 지원하지 않습니다.

def shuffle(self, x, random=None, int=int):
    """x, random=random.random -> shuffle list x in place; return None.

    Optional arg random is a 0-argument function returning a random
    float in [0.0, 1.0); by default, the standard random.random.
    """

    randbelow = self._randbelow
    for i in reversed(range(1, len(x))):
        # pick an element in x[:i+1] with which to exchange x[i]
        j = randbelow(i+1) if random is None else int(random() * (i+1))
        x[i], x[j] = x[j], x[i]

실행 시shuffle기능 그것은 다음과 같은 오류를 제기합니다, 왜 그렇습니까?

TypeError: 'dict_keys' object does not support indexing

분명히 당신은 통과하고 있습니다.d.keys()당신에게shuffle기능.아마도 이것은 python2.x로 작성되었을 것입니다 (때d.keys()목록을 반환했습니다.python 3.x에서는d.keys()를 반환합니다.dict_keys훨씬 더 많이 행동하는 물체.seta보다list따라서 색인화할 수 없습니다.

해결책은 통과하는 것입니다.list(d.keys())(또는 간단히)list(d)) ~로shuffle.

당신은 그 결과를 통과하고 있습니다.somedict.keys()함수에 대하여파이썬 3에서,dict.keys목록을 반환하지 않지만 사전 키 보기를 나타내는 집합 모양 개체는 인덱싱을 지원하지 않습니다.

문제를 해결하려면 다음을 사용합니다.list(somedict.keys())열쇠를 수집하고, 그것으로 작업합니다.

오래된 항목을 목록으로 변환하면 비용이 발생할 수 있습니다.대신 첫 번째 항목을 가져오려면 다음을 사용할 수 있습니다.

next(iter(keys))

또는 모든 항목에 대해 반복하려면 다음을 사용할 수 있습니다.

items = iter(keys)
while True:
    try:
        item = next(items)
    except StopIteration as e:
        pass # finish

Python 2에서는 dict.keys()가 목록을 반환하는 반면, Python 3에서는 생성기를 반환합니다.

값을 반복할 수만 있습니다. 그렇지 않으면 목록으로 명시적으로 변환해야 할 수 있습니다. 즉, 목록 함수로 전달해야 할 수도 있습니다.

셔플이 이미 존재하는데 왜 셔플을 구현해야 합니까?거인들의 어깨 위에 머무르세요.

import random

d1 = {0:'zero', 1:'one', 2:'two', 3:'three', 4:'four',
     5:'five', 6:'six', 7:'seven', 8:'eight', 9:'nine'}

keys = list(d1)
random.shuffle(keys)

d2 = {}
for key in keys: d2[key] = d1[key]

print(d1)
print(d2)

언급URL : https://stackoverflow.com/questions/17322668/typeerror-dict-keys-object-does-not-support-indexing

반응형