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
5 ответов:
вы передаете результат
somedict.keys()функции. В Python 3,dict.keysне возвращает список, но set-like объект, который представляет собой представление ключей словаря и (будучи set-like) не поддерживает индексирование.чтобы устранить проблему, используйте
list(somedict.keys()), чтобы забрать ключи, и работать с этим.
в Python 2 dict.keys () возвращает список, тогда как в Python 3 он возвращает генератор.
вы можете только перебирать его значения, иначе вам может потребоваться явно преобразовать его в список, т. е. передать его в функцию списка.
зачем вам нужно реализовать shuffle, когда он уже существует? Оставайтесь на плечах гигантов.
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)
преобразование итеративного в список может стоить вместо него вы можете использовать
next(iter(keys))для первого элемента или если вы хотите, чтобы itrate все элементы использовать
items = iter(keys) while True: try: item = next(items) except StopIteration as e: pass # finish
Comments