【问题标题】:Type Error when Randomize Dictionary in Python在 Python 中随机化字典时出现类型错误
【发布时间】:2012-09-10 08:32:47
【问题描述】:

我正在制作一个简单的闪存卡程序来建立我的词汇量,因此需要随机化一个字典 我在这个网站上找到了很多有用的答案,在这个网站上找到了很多,并注意到随机播放是一种选择(我知道有 random.choice,但我选择了随机播放)但有些东西我没有掌握。看起来像这样:

import random

vocab_dict = {'word1':'def1',
           'word2':'def2',
           'etc.':'etc.'}

vocab_dict_rand = vocab_dict.keys()  
random.shuffle(vocab_rand)           **#<--This is where problem occurs**

for key in vocab_rand:
      print word
      input ""
      print definition
      input ""

input exit

因此程序崩溃并使用 random.shuffle(vocab_rand)... 指向该行。

我在 shell 中得到了这个

  File "C:\Python31\lib\random.py", line 270, in shuffle
    x[i], x[j] = x[j], x[i]
TypeError: 'dict_keys' object does not support indexing

任何帮助将不胜感激。

【问题讨论】:

  • 您覆盖了编辑之前保存的格式编辑。

标签: python dictionary typeerror


【解决方案1】:

在 Python 3 中,dict.keys() 返回一个特殊的 dict_keys 对象,它的作用就像一个列表——它不是一个真正的列表,所以你不能对它进行索引或洗牌(它应该只用于迭代)。

改为使用vocab_rand = list(vocab_dict.keys())

【讨论】:

  • 哇...这很有启发性。所以我认为 TypeError 是需要将字典复制到列表形式中。这在早期版本中不是问题吗?非常感谢。
  • 在早期版本中,dict.keys() 返回了一个列表。但是,迭代似乎非常频繁(生成整个列表效率低下)。在 Python 3 中,他们将其更改为生成迭代器(实际上是支持迭代协议的特殊对象)。这与对其他几个内置函数的更改保持一致,例如 rangemapzip,它们都在 Python3 中返回迭代器,但在 Python 2 中生成列表。
【解决方案2】:

在 Python 3 中,keys 返回一个迭代器,而不是一个列表。你需要有一个随机播放列表。使用vocab_dict_rand = list(vocab_dict.keys())

【讨论】:

  • 非常感谢。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 2022-01-23
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多