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에서는 생성기를 반환합니다.
당신은 그것의 값을 반복 할 수 있습니다. 그렇지 않으면 그것을 명시 적으로 목록으로 변환해야합니다. 즉, 목록 함수에 전달하십시오.