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]
Quando executo a shuffle
função, ela gera o seguinte erro, por que isso?
TypeError: 'dict_keys' object does not support indexing
python
python-3.x
dictionary
gate_007
fonte
fonte
Respostas:
Claramente você está passando para
d.keys()
a suashuffle
função. Provavelmente isso foi escrito com python2.x (quandod.keys()
retornou uma lista). Com python3.x,d.keys()
retorna umdict_keys
objeto que se comporta muito mais como aset
que com alist
. Como tal, não pode ser indexado.A solução é passar
list(d.keys())
(ou simplesmentelist(d)
) parashuffle
.fonte
list(d)
o que lhe dará uma lista de chaves em ambos python2.x e python3.x sem fazer quaisquer cópias :-)dict_keys
objeto se comporta muito mais como apenas as teclas metade de um ditado. Especificamente, eles suportam O (1) teste de associação (e outros métodos de conjunto que podem ser implementados com eficiência além disso). Essas coisas não são possíveis com uma lista e, se você quiser uma lista das chaves do ditado, sempre poderá fazer issolist(your_dictionary)
para obtê-lo.shuffle
é o nome da função no código do pôster original (a função que está lançando o erro). Olhando para o código, acho que era copiar / colar derandom.shuffle
implementação 's na biblioteca padrão :-)Você está passando o resultado de
somedict.keys()
para a função. No Python 3,dict.keys
não retorna uma lista, mas um objeto semelhante a um conjunto que representa uma visualização das chaves do dicionário e (sendo semelhante a um conjunto) não suporta indexação.Para corrigir o problema, use
list(somedict.keys())
para coletar as chaves e trabalhe com isso.fonte
Converter um iterável em uma lista pode ter um custo. Em vez disso, para obter o primeiro item, você pode usar:
Ou, se você quiser iterar sobre todos os itens, poderá usar:
fonte
Por que você precisa implementar o shuffle quando ele já existe? Fique nos ombros dos gigantes.
fonte
No Python 2, dict.keys () retorna uma lista, enquanto no Python 3 retorna um gerador.
Você só pode iterar sobre seus valores; caso contrário, pode ser necessário convertê-lo explicitamente em uma lista, ou seja, passá-lo para uma função de lista.
fonte