Suppression d'éléments de façon aléatoire à partir d'un dictionnaire

Comment puis-je supprimer des éléments aléatoires à partir d'un dictionnaire en Python?

Je dois enlever un certain nombre d'éléments à partir d'un dictionnaire et j'ai donc essayé d'utiliser dict.popitem j'ai pensé que c'était aléatoire, mais il semble qu'il ne l'est pas.

Comme le docs dire:

Retirer et de retourner un arbitraire (clé,
la valeur de la paire à partir du dictionnaire.

Pour mon problème, supposons que j'ai un dictionnaire comme (un exemple):

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

Maintenant, j'ai besoin de supprimer certains éléments de celui-ci (le nombre est spécifié par l'utilisateur).

J'ai donc écrit ceci:

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

Mais le problème avec ce code, à chaque fois que le script est exécuté, popitem() pop exactement les mêmes éléments. Vous êtes libre de le tester, j'ai déjà essayé plusieurs fois.

Donc ma question est:

  • Pourquoi n'est-ce pas popitem() de travail comme il le devrait? Est la suppression arbitraire des éléments non aléatoire?
  • Comment puis-je supprimer des éléments aléatoires à partir d'un dictionnaire?
Arbitraire != aléatoire.
Alors qu'est-ce arbitrary?
Probablement à l'intérieur de la commande de la paire (qui est également reflété par l'itération de l'ordre - qui, rappelons-le, est abritary mais pas au hasard). Dicts sont "non ordonnée", mais l'ordre dans lequel les éléments sont stockés à l'intérieur est déterministe - si vous prenez paramètres en compte, normalement, vous ne pensez même pas: Les hachages de clés, de l'ordre d'insertion, les collisions, le nombre total d'objets... en créant le même dictionnaire de la même façon, en effet, de créer le même interne de la commande.
Il doit être arbitraires, car un dictionnaire lui-même est organisé de manière arbitraire.

OriginalL'auteur user225312 | 2011-01-26