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
618   5  

5 ответов:

очевидно, вы проходите в d.keys() на

вы передаете результат 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

    Ничего не найдено.