TypeError: 'dict_keys' object does not support indexing

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]

When I run the shuffle function it raises the following error, why is that?

TypeError: 'dict_keys' object does not support indexing
154777 次浏览

显然,您正在将 d.keys()传递给 shuffle函数。这可能是用 python2.x 编写的(当 d.keys()返回一个列表时)。对于 python3.x,d.keys()返回一个 dict_keys对象,它的行为更像 set而不是 list。因此,它不能被索引。

解决方案是将 list(d.keys())(或简称 list(d))传递给 shuffle

somedict.keys()的结果传递给函数。在 Python 3中,dict.keys不返回列表,但是表示字典键视图的类集对象(类集)不支持索引。

要解决这个问题,可以使用 list(somedict.keys())来收集密钥,并使用它。

既然洗牌已经存在,为什么还需要实现它? 站在巨人的肩膀上。

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))

或者,如果希望对所有项进行迭代,可以使用:

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

在 Python 2 dict.keys ()中返回一个列表,而在 Python 3中返回一个生成器。

您只能迭代它的值,否则您可能必须显式地将其转换为一个列表,即将其传递给一个列表函数。