TypeError: 'dict_keys' object does not support indexing

gat*_*007 135 python dictionary python-3.x

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]
Run Code Online (Sandbox Code Playgroud)

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

TypeError: 'dict_keys' object does not support indexing
Run Code Online (Sandbox Code Playgroud)

mgi*_*son 221

很明显,你正在传递d.keys()你的shuffle功能.可能这是用python2.x编写的(当d.keys()返回列表时).使用python3.x,d.keys()返回dict_keys一个set比a 更像的对象list.因此,它无法编入索引.

解决方案是通过list(d.keys())(或简单地list(d))shuffle.

  • ...或者只是`list(d)`它会给你一个python2.x和python3.x上的键列表而不做任何副本:-) (20认同)
  • 你可能会这么认为,但我绝对认为这是正确的决定.`dict_keys`对象的行为更像是dict的一半键.具体来说,它们支持O(1)成员资格测试(以及可以在该事实之上有效实施的其他类似集合的方法).这些东西是不可能的列表,如果你想要一个dict键的列表,你总是能够简单地做`list(your_dictionary)`来得到它. (9认同)
  • 这是python3的一个奇怪的突破性变更设计决定. (8认同)
  • @Crt - `shuffle`是原始海报代码中的函数名称(抛出错误的函数).看一下代码,我认为它是从标准库中的`random.shuffle`实现中复制/粘贴的:-) (2认同)

use*_*342 11

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

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


sah*_*ama 8

将iterable转换为列表可能会产生成本.相反,要获得第一个项目,您可以使用:

next(iter(keys))
Run Code Online (Sandbox Code Playgroud)

或者,如果要迭代所有项目,可以使用:

items = iter(keys)
while True:
    try:
        item = next(items)
    except StopIteration as e:
        pass # finish
Run Code Online (Sandbox Code Playgroud)