[python] TypeError : ‘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()목록을 반환 할 때 ). python3.x를 사용하면 a 보다 훨씬 많이 작동 d.keys()하는 dict_keys객체를 반환 set합니다 list. 따라서 색인을 생성 할 수 없습니다.

용액을 통과하는 list(d.keys())(또는 간단히 list(d)하기 위해) shuffle.


답변

결과를 somedict.keys()함수에 전달합니다 . Python 3에서는 dict.keys목록을 반환하지 않지만 사전 키의 뷰를 나타내고 집합과 같은 집합 같은 개체는 인덱싱을 지원하지 않습니다.

문제를 해결하려면 list(somedict.keys())키를 수집하고이를 사용 하여 작업하십시오.


답변

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

next(iter(keys))

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

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


답변

셔플이 이미 존재하는 경우 왜 구현해야합니까? 거인의 어깨에 머 무르십시오.

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)


답변

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

당신은 그것의 값을 반복 할 수 있습니다. 그렇지 않으면 그것을 명시 적으로 목록으로 변환해야합니다. 즉, 목록 함수에 전달하십시오.


답변