Python 从字典中随机删除项

Python 从字典中随机删除项,python,random,dictionary,Python,Random,Dictionary,如何在Python中从字典中删除随机项 我必须从字典中删除指定数量的条目,因此我尝试使用dict.popitem,我认为这是随机的,但似乎不是 俗话说: 删除并返回任意(密钥, 值)从字典中进行配对 对于我的问题,假设我有一本字典,例如: 现在我需要从中删除一些项目(计数由用户指定) 所以我写了这个: >>> for _ in range(4): # assume 4 items have to removed ... d.popitem() ...

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

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

俗话说:

删除并返回任意(密钥, 值)从字典中进行配对

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

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

所以我写了这个:

>>> for _ in range(4):          # assume 4 items have to removed
...     d.popitem()
... 
('a', 1)
('c', 3)
('b', 2)
('e', 5)
但这段代码的问题是,每次运行脚本时,
popitem()
都会弹出完全相同的项目。你可以自由测试,我已经试过多次了

所以我的问题是:

  • 为什么
    popitem()
    没有按应有的方式工作?删除任意项目不是随机的吗
  • 如何从字典中删除随机项
popitem()
是任意的,但不是随机的。如果要访问随机元素

import random
key = random.choice(d.keys())
val = d[key]
del d[key]

这就是你说的吗

import random
for i in range(4):
    some_dict.pop( random.choice(some_dict.keys()) )   
删除“任意”元素意味着函数可以删除它喜欢的任何项。这并不意味着它必须是特别随机的

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

import random
for key in random.sample(d.keys(), 4):
   del d[key]
  • 为什么popitem()没有按应有的方式工作?删除任意项目不是随机的吗
武断与随机并不是一回事。“任意”只是指可以返回任何项目,并且不应假设它们返回的顺序

  • 如何从字典中删除随机项
我并不认为这是最好或最有效的方法,但有一种方法是:

import random
dict.pop(random.choice(dict.keys())

要删除指定数量的项,我将使用
random.sample
,而不是重复调用
dict.keys
random.choice

for key in random.sample(d.keys(), n):
    del d[key] # or d.pop(key)
试试这个 我试图实现相同的{任意从字典中删除任何项目},但它总是删除url 但是当我把它改成

d = {'spam': 0,'arl': 'http://www.python.org',  'title': 'Python Web Site'}
d.popitem()
print d
注意:url的“u”更改为“a”

标题被删除

我猜它会从列表中删除具有最高ASCII值的项\
只是猜测而已

武断!=随机。那么,这是什么?
任意的
基于?可能是基于对的内部顺序(这也反映在迭代顺序上-同样,迭代顺序是基本的,但不是随机的)。DICT是“无序”的,但项目内部存储的顺序是确定的——如果考虑到参数,您通常甚至不会想到:键的散列、插入顺序、冲突、项目总数。。。因此,再次以同样的方式创建相同的词典确实会创建相同的内部顺序。它必须是任意的,因为词典本身是任意组织的。该死!比我快。哦,嗯,+1。我现在似乎明白了这一点。几乎,尽管我觉得没有想到这一点真的很愚蠢:-)这被称为“知觉缩小”。您缩小了您的关注范围,以了解有关
popitem
的所有内容,即使这并不能解决您的问题。当事情看起来困难时,你可能做错了。停止看看周围。去喝茶。想一想更简单的事情。不过,很重要的一点,我查了一下“知觉缩小”,它似乎与婴儿期大脑的发育有关。更多的谷歌搜索出现了,.@S.Lott:这篇文章的链接死了。你能在什么地方找到另一个来源吗?谢谢@PatrickMcElhaney如果你在互联网上的其他地方查找知觉缩小,它确实描述了S.Lott的建议。也许这是一个更通俗的说法?我认为他的意思是,你可以专注于某件事(“这一定是解决方案!”),浪费大量时间深入钻研,而如果你只是休息一下,退后一步,你可能会发现其他事情是一个更有希望的解决方案。我倾向于自己编写代码,这就是为什么(我认为)我理解他所说的。(“认知隧道”可能也是他暗指的)。
popitem
就是我要找的!
d = {'spam': 0,'url': 'http://www.python.org',  'title': 'Python Web Site'}
d.popitem()
print d
d = {'spam': 0,'arl': 'http://www.python.org',  'title': 'Python Web Site'}
d.popitem()
print d