Удаление элементов случайным образом из словаря - PullRequest
4 голосов
/ 26 января 2011

Как удалить случайные элементы из словаря в 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}

Теперь мне нужно удалить некоторые элементы из него (количество указывается пользователем).

Итак, я написал это:

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

Но проблема этого кода в том, что при каждом запуске скрипта popitem() выскакивает точно одинаковых элементов. Вы можете это проверить, я уже пробовал это несколько раз.

Итак, мой вопрос:

  • Почему popitem() не работает так, как должно? Удаление случайных предметов не случайно?
  • Как удалить случайные элементы из словаря?

Ответы [ 6 ]

16 голосов
/ 26 января 2011

Это то, о чем вы говорите?

import random
for i in range(4):
    some_dict.pop( random.choice(some_dict.keys()) )   
8 голосов
/ 26 января 2011

Удаление «произвольного» элемента означает, что функция может удалить любой элемент, который ей нравится.Это не значит, что он должен быть особенно случайным.

Для реальной случайности вы должны использовать модуль random.Например:

import random
for key in random.sample(d.keys(), 4):
   del d[key]
8 голосов
/ 26 января 2011

popitem() является произвольным, но не случайным. Если вы хотите получить доступ к случайному элементу

import random
key = random.choice(d.keys())
val = d[key]
del d[key]
4 голосов
/ 26 января 2011
  • Почему popitem () не работает так, как должен? Удаление произвольных предметов не случайно?

Произвольный не означает то же самое, что и случайный. Произвольный просто означает, что любой из предметов может быть возвращен, и ничего не следует предполагать относительно порядка, в котором они возвращаются.

  • Как удалить случайные элементы из словаря?

Я не утверждаю, что это лучший или самый эффективный способ, но один из них:

import random
dict.pop(random.choice(dict.keys())
3 голосов
/ 26 января 2011

Для удаления указанного количества элементов я бы использовал random.sample вместо повторных вызовов на dict.keys и random.choice

for key in random.sample(d.keys(), n):
    del d[key] # or d.pop(key)
1 голос
/ 30 мая 2013
d = {'spam': 0,'url': 'http://www.python.org',  'title': 'Python Web Site'}
d.popitem()
print d

попробуйте это Я пытался добиться того же {произвольно любой элемент из словаря}, но он всегда удалял URL но когда я изменил его на

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

примечание: 'u' URL-адреса изменено на 'a'

заголовок удален

Я предполагаю, что он удаляет элементы из списка, которые имеют самое высокое значение ASCII, \ просто угадал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...