从字典中随机删除项目

时间:2011-01-26 19:29:33

标签: python random dictionary

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

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

正如docs所说:

  

删除并返回任意(键,   来自字典的对。

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

>>> 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()不应该按照应有的方式工作?删除任意项目不是随意的吗?
  • 如何从字典中删除随机项?

6 个答案:

答案 0 :(得分:16)

这就是你在谈论的吗?

import random
for i in range(4):
    some_dict.pop( random.choice(some_dict.keys()) )   

答案 1 :(得分:8)

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

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

答案 2 :(得分:8)

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

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

import random
for key in random.sample(d.keys(), 4):
   del d[key]

答案 3 :(得分:4)

  
      
  • 为什么popitem()不应该按照它的方式工作?删除任意项目不是随意的吗?
  •   

任意并不意味着随机相同。任意简单地意味着可以返回任何项目,并且不应该假设它们被返回的顺序。

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

我并不认为这是最好或最有效的方式,但有一种方法是:

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

答案 4 :(得分:3)

要删除指定数量的项目,我会使用random.sample而不是重复拨打dict.keysrandom.choice

for key in random.sample(d.keys(), n):
    del d[key] # or d.pop(key)

答案 5 :(得分:1)

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
  

注意:网址的'你'改为'a'

标题已删除

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