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

5 回答 5

259

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

解决方案是传递list(d.keys())(或简单地list(d))到shuffle.

于 2013-06-26T14:19:04.113 回答
13

您正在将结果传递somedict.keys()给函数。在 Python 3 中,dict.keys不返回一个列表,而是一个类似集合的对象,它表示字典键的视图并且(类似集合)不支持索引。

要解决此问题,请使用list(somedict.keys())收集密钥并使用它。

于 2013-06-26T14:19:28.943 回答
11

将可迭代对象转换为列表可能会产生成本。相反,要获取第一项,您可以使用:

next(iter(keys))

或者,如果您想遍历所有项目,您可以使用:

items = iter(keys)
while True:
    try:
        item = next(items)
    except StopIteration as e:
        pass # finish
于 2017-10-10T07:54:09.663 回答
2

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

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

于 2018-01-30T08:02:12.497 回答
0

为什么在已经存在的情况下需要实现 shuffle?站在巨人的肩膀上。

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)
于 2017-04-13T16:12:50.390 回答