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