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
python
python-3.x
dictionary
gate_007
источник
источник
Ответы:
Очевидно, вы переходите
d.keys()
к своейshuffle
функции. Вероятно, это было написано с python2.x (когдаd.keys()
возвращали список). С python3.xd.keys()
возвращаетdict_keys
объект, который ведет себя намного больше,set
чем alist
. Как таковой, он не может быть проиндексирован.Решение состоит в том, чтобы перейти
list(d.keys())
(или простоlist(d)
) кshuffle
.источник
list(d)
который даст вам список ключей на python2.x и python3.x без создания копий :-)dict_keys
Объект ведет себя намного больше , как просто ключи половины Dict. В частности, они поддерживают тестирование членства O (1) (и другие методы, подобные множеству, которые могут быть эффективно реализованы в дополнение к этому факту). Эти вещи невозможны со списком, и если вы хотите получить список ключей dict, вы всегда можете просто сделать это,list(your_dictionary)
чтобы получить его.shuffle
это имя функции в исходном коде автора (функция, которая выдает ошибку). Глядя на код, я думаю, что он был скопирован / вставлен изrandom.shuffle
реализации в стандартной библиотеке :-)Вы передаете результат
somedict.keys()
функции. В Python 3dict.keys
не возвращает список, но подобный множеству объект, который представляет представление ключей словаря и (будучи подобным множеству), не поддерживает индексирование.Чтобы решить проблему, используйте
list(somedict.keys())
для сбора ключей и работать с этим.источник
Преобразование итерируемого в список может иметь стоимость. Вместо этого, чтобы получить первый элемент, вы можете использовать:
Или, если вы хотите перебрать все элементы, вы можете использовать:
источник
Зачем вам нужно реализовывать shuffle, когда он уже существует? Оставайтесь на плечах гигантов.
источник
В Python 2 dict.keys () возвращает список, тогда как в Python 3 он возвращает генератор.
Вы можете перебирать только его значения, иначе вам может понадобиться явно преобразовать его в список, то есть передать его в функцию списка.
источник