Removing items randomly from a dictionary

2020-06-04 13:13发布

How do I remove random items from a dictionary in Python?

I have to remove a specified number of items from a dictionary and so I tried to use dict.popitem which I thought was random, but it is seems it is not.

As the docs say:

Remove and return an arbitrary (key, value) pair from the dictionary.

For my problem, suppose I have a dictionary like (an example):

>>> 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}

Now I need to remove some items from it (the count is specified by the user).

So I wrote this:

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

But the problem with this code is, every time the script is run, popitem() pops exactly the same items. You are free to test this, I have already tried it multiple times.

So my question is:

  • Why isn't popitem() working the way it should? Is removing arbitrary items not random?
  • How do I remove random items from a dictionary?

6条回答
虎瘦雄心在
2楼-- · 2020-06-04 13:47

popitem() is arbitrary but not random. If you want to access a random element

import random
key = random.choice(d.keys())
val = d[key]
del d[key]
查看更多
做自己的国王
3楼-- · 2020-06-04 13:48

Is this what you're talking about?

import random
for i in range(4):
    some_dict.pop( random.choice(some_dict.keys()) )   
查看更多
Anthone
4楼-- · 2020-06-04 13:53

Removing an "arbitrary" element means that the function can remove whatever item it likes. That doesn't mean that it has to be especially random about it.

For real randomness you should use the random module. For example:

import random
for key in random.sample(d.keys(), 4):
   del d[key]
查看更多
家丑人穷心不美
5楼-- · 2020-06-04 14:01
  • Why isn't popitem() working the way it should? Is removing arbitrary items not random?

Arbitrary does not mean the same thing as random. Arbitrary simply means that any of the items can be returned and nothing should be assumed about the order they are returned in.

  • How do I remove random items from a dictionary?

I do not claim this is the best or most efficient way, but one way is:

import random
dict.pop(random.choice(dict.keys())
查看更多
我欲成王,谁敢阻挡
6楼-- · 2020-06-04 14:04

For removing a specified number of items, I would use random.sample instead of making repeated calls to dict.keys and random.choice

for key in random.sample(d.keys(), n):
    del d[key] # or d.pop(key)
查看更多
何必那么认真
7楼-- · 2020-06-04 14:04
d = {'spam': 0,'url': 'http://www.python.org',  'title': 'Python Web Site'}
d.popitem()
print d

try this one I was trying to achieve the same { arbitrarily any item from dictionary } but it always deleted url but when I changed it to

d = {'spam': 0,'arl': 'http://www.python.org',  'title': 'Python Web Site'}
d.popitem()
print d

notice: 'u' of url changed to 'a'

title is deleted

I guess It deletes items from the list which are having highest ASCII value, \ just guessing

查看更多
登录 后发表回答