我有一个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具有订单,因此能够直接对其排序似乎很合理。转换为列表效率很低。
问题是:
您不能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] 删除。
我来说两句