Подтвердить что ты не робот

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
4b9b3361

Ответ 1

Очевидно, что вы передаете d.keys() в свою функцию shuffle. Вероятно, это было написано с помощью python2.x(когда d.keys() вернул список). С python3.x, d.keys() возвращает объект dict_keys, который ведет себя намного больше, чем set, чем a list. Таким образом, он не может быть проиндексирован.

Решение состоит в том, чтобы передать list(d.keys()) (или просто list(d)) на shuffle.

Ответ 2

Вы передаете результат somedict.keys() функции. В Python 3 dict.keys не возвращает список, но объект, похожий на набор, который представляет представление ключей словаря и (будучи установленным) не поддерживает индексирование.

Чтобы устранить проблему, используйте list(somedict.keys()), чтобы собрать ключи и работать с ними.

Ответ 3

Преобразование итерируемого в список может иметь стоимость. Вместо этого, чтобы получить первый элемент, вы можете использовать:

next(iter(keys))

Или, если вы хотите перебрать все элементы, вы можете использовать:

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

Ответ 4

В Python 2 dict.keys() возвращает список, тогда как в Python 3 он возвращает генератор.

Вы можете перебирать только эти значения, иначе вам, возможно, придется явно преобразовать их в список, то есть передать его в функцию списка.

Ответ 5

Почему вам нужно реализовать тасование, когда оно уже существует? Оставайтесь на плечах гигантов.

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)