为什么不能对OrderedDict进行洗牌?

米格尔

我有一个OrderedDict,想像这样洗牌:

od = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
random.shuffle(od)

不幸的是,这不起作用(python3),并KeyError: 0引发异常。我正在尝试的替代方法是转换为列表,随机播放并重建OrderedDict:

od_tmp = list(od.items())
random.shuffle(od_temp)
od = OrderedDict(od_tmp)

由于OrderedDict具有订单,因此能够直接对其排序似乎很合理。转换为列表效率很低。

问题是:

  • 有没有比上述解决方案更好的方法?(不求助于仅使用列表)
  • 为什么我不能随机播放OrderedDict?
用户395760

您不能random.shuffle使用OrderedDict,因为random.shuffle在编写时要牢记序列不幸的是,最好的随机播放算法(Fisher-Yates随机播放)需要有效的随机访问,但是OrderedDict不提供基于顺序的随机访问(仅基于密钥)。可能是洗牌的基本链表一个聪明和快速的方式,但我不知道有任何。

您可以实现按顺序迭代的Fisher-Yates随机播放,而不是进行随机访问,但这会更慢(二次复杂度和相当高的常数)。一种减少拷贝且不构造无意义元组的选项是仅对键进行随机排序,然后对原始的OrderedDict重新排序:

keys = list(od)
random.shuffle(keys)
for key in keys:
    od.move_to_end(key)

但是我不确定这是否更具可读性和美感。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么 Java 不能对这段代码进行类型检查?

来自分类Dev

为什么不能对函数自变量求值进行排序?

来自分类Dev

为什么不能对void指针进行算术运算?

来自分类Dev

为什么不能对C函数进行名称修改?

来自分类Dev

为什么我不能对这个数组进行排序?

来自分类Dev

为什么我不能对这张PowerBI图表进行排序?

来自分类Dev

为什么sed不能对文件进行任何更改?

来自分类Dev

为什么我不能对依赖类型使用nullptr模板参数进行专业化处理?

来自分类Dev

为什么CakePHP 3.2 Paginator不能对我的查询结果进行排序?

来自分类Dev

为什么 Lombok Builder 不能对现有对象进行变异?

来自分类Dev

为什么我不能对我在python中编写的基本链表方法进行基本测试?

来自分类Dev

为什么不能对控制流图(CFG)进行拓扑排序?

来自分类Dev

为什么这个模板化函数不能对数组进行零初始化编译?

来自分类Python

为什么我不能对相同的数据进行两次迭代?

来自分类Python

为什么我不能对相同的数据进行两次迭代?

来自分类Dev

为什么我不能对我在SQLAlchemy中有很多关系的查询进行查询?

来自分类Dev

为什么 Rust 不能对不可变变量进行可变借用?

来自分类Dev

为什么 NLTK Lemmatizer 不能对一些复数词进行词形还原?

来自分类Dev

C ++为什么不能对结构进行算术运算或将变量强制转换为结构?

来自分类Dev

当字符串在资源中时,为什么String.Format不能对字符进行转义?

来自分类Dev

为什么我不能对reference_wrapper <std :: chrono :: milliseconds>的向量进行排序?

来自分类Dev

为什么我不能对此二进制图像进行斑点检测

来自分类Dev

为什么我不能对我的数组进行排序和重复数据删除?

来自分类Dev

为什么我不能对某些命令进行sudo?(例如vim)

来自分类Dev

为什么Haskell不能对此进行优化?(在Maybe monad中没有不必要的传播。)

来自分类Dev

为什么我不能对通过自定义manage.py命令创建的Django用户进行身份验证?

来自分类Java

为什么是的ArrayLists的ArrayList不能对多维?

来自分类Dev

为什么不能对选择框的选项做forEach?

来自分类Dev

为什么超时不能对在sudo下运行的tcpdump生效?

Related 相关文章

  1. 1

    为什么 Java 不能对这段代码进行类型检查?

  2. 2

    为什么不能对函数自变量求值进行排序?

  3. 3

    为什么不能对void指针进行算术运算?

  4. 4

    为什么不能对C函数进行名称修改?

  5. 5

    为什么我不能对这个数组进行排序?

  6. 6

    为什么我不能对这张PowerBI图表进行排序?

  7. 7

    为什么sed不能对文件进行任何更改?

  8. 8

    为什么我不能对依赖类型使用nullptr模板参数进行专业化处理?

  9. 9

    为什么CakePHP 3.2 Paginator不能对我的查询结果进行排序?

  10. 10

    为什么 Lombok Builder 不能对现有对象进行变异?

  11. 11

    为什么我不能对我在python中编写的基本链表方法进行基本测试?

  12. 12

    为什么不能对控制流图(CFG)进行拓扑排序?

  13. 13

    为什么这个模板化函数不能对数组进行零初始化编译?

  14. 14

    为什么我不能对相同的数据进行两次迭代?

  15. 15

    为什么我不能对相同的数据进行两次迭代?

  16. 16

    为什么我不能对我在SQLAlchemy中有很多关系的查询进行查询?

  17. 17

    为什么 Rust 不能对不可变变量进行可变借用?

  18. 18

    为什么 NLTK Lemmatizer 不能对一些复数词进行词形还原?

  19. 19

    C ++为什么不能对结构进行算术运算或将变量强制转换为结构?

  20. 20

    当字符串在资源中时,为什么String.Format不能对字符进行转义?

  21. 21

    为什么我不能对reference_wrapper <std :: chrono :: milliseconds>的向量进行排序?

  22. 22

    为什么我不能对此二进制图像进行斑点检测

  23. 23

    为什么我不能对我的数组进行排序和重复数据删除?

  24. 24

    为什么我不能对某些命令进行sudo?(例如vim)

  25. 25

    为什么Haskell不能对此进行优化?(在Maybe monad中没有不必要的传播。)

  26. 26

    为什么我不能对通过自定义manage.py命令创建的Django用户进行身份验证?

  27. 27

    为什么是的ArrayLists的ArrayList不能对多维?

  28. 28

    为什么不能对选择框的选项做forEach?

  29. 29

    为什么超时不能对在sudo下运行的tcpdump生效?

热门标签

归档