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 

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

解决办法是通过list(d.keys()) (或简单地list(d) )来shuffle

您将somedict.keys()的结果传递给该函数。 在Python 3中, dict.keys不会返回一个列表,而是一个表示字典键(和set-like)视图的类集对象不支持索引。

要解决这个问题,请使用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