从字典中随机删除项目

use*_*312 4 python random dictionary

如何从Python中删除字典中的随机项?

我必须从字典中删除指定数量的项目,所以我尝试使用dict.popitem我认为是随机的,但似乎不是.

正如文档所说:

从字典中删除并返回任意(键,值)对.

对于我的问题,假设我有一个字典(例如):

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

现在我需要从中删除一些项目(计数由用户指定).

所以我写了这个:

>>> for _ in range(4):          # assume 4 items have to removed
...     d.popitem()
... 
('a', 1)
('c', 3)
('b', 2)
('e', 5)
Run Code Online (Sandbox Code Playgroud)

但是这段代码的问题是,每次运行脚本时,都会popitem()弹出完全相同的项目.您可以自由测试,我已经多次尝试过.

所以我的问题是:

  • 为什么不popitem()按照应有的方式工作?删除任意项目不是随机的?
  • 如何从字典中删除随机项?

S.L*_*ott 17

这就是你在说什么?

import random
for i in range(4):
    some_dict.pop( random.choice(some_dict.keys()) )   
Run Code Online (Sandbox Code Playgroud)

  • 它被称为"感知缩小".你缩小了你的注意力,以便了解"popitem"的一切,即使它没有解决你的问题.当事情看起来很难,你可能做错了.停止.环视四周.喝茶.想想更简单的事情. (21认同)
  • python3: some_dict.pop(random.choice(list(some_dict.keys()))) (3认同)
  • 差不多,虽然我觉得很愚蠢没有想到这个:-) (2认同)
  • 然而,很重要的是,我抬头看了"感知变窄",这似乎与大脑在婴儿时期的发展有关.更多的谷歌搜索出现["注意力不集中"](http://en.wikipedia.org/wiki/Inattention_blindness)和["认知隧道"](http://en.wikipedia.org/wiki/Cognitive_capture). (2认同)

sth*_*sth 9

删除"任意"元素意味着该函数可以删除它喜欢的任何项目.这并不意味着它必须特别随意.

对于真正的随机性,您应该使用该random模块.例如:

import random
for key in random.sample(d.keys(), 4):
   del d[key]
Run Code Online (Sandbox Code Playgroud)


Vla*_*d H 8

popitem()是随意的,但不是随意的.如果要访问随机元素

import random
key = random.choice(d.keys())
val = d[key]
del d[key]
Run Code Online (Sandbox Code Playgroud)