【发布时间】:2011-06-16 02:15:32
【问题描述】:
如何在 Python 中从字典中删除随机项?
我必须从字典中删除指定数量的项目,所以我尝试使用dict.popitem,我认为这是随机的,但似乎不是。
正如docs 所说:
移除并返回一个任意的 (key, value) 字典中的对。
对于我的问题,假设我有一个像(示例)这样的字典:
>>> d = dict(zip((string.ascii_lowercase), range(1, 10)))
>>> d
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8}
现在我需要从中删除一些项目(计数由用户指定)。
所以我写了这个:
>>> for _ in range(4): # assume 4 items have to removed
... d.popitem()
...
('a', 1)
('c', 3)
('b', 2)
('e', 5)
但是这段代码的问题是,每次运行脚本时,popitem() 都会弹出完全相同的项目。这个你可以随意测试,我已经试过很多次了。
所以我的问题是:
- 为什么
popitem()没有按应有的方式工作?删除任意项目不是随机的吗? - 如何从字典中删除随机项?
【问题讨论】:
-
任意!=随机。
-
那么这个
arbitrary是基于什么? -
可能在对的内部排序上(这也反映在迭代顺序上——这也是随意的,但不是随机的)。字典是“无序的”,但项目在内部存储的顺序是确定性的 - 如果您考虑到通常甚至不会想到的参数:键的哈希值、插入顺序、冲突, 总项目数...因此再次以相同方式创建相同的字典确实会创建相同的内部排序。
-
它必须是任意的,因为字典本身是任意组织的。
标签: python random dictionary