2010-10-23 16 views
4

Existe-t-il un idiome pour obtenir une clé arbitraire, une paire de valeurs d'un dictionnaire sans les supprimer? (P3K)version non destructive de pop() pour un dictionnaire

EDIT:

Désolé pour le libellé confus. J'ai utilisé le mot arbitraire dans le sens où je me fous de ce que je reçois. C'est différent du hasard, où je me soucie de ce que je reçois (c'est-à-dire, j'ai besoin que les probabilités de chaque élément soit choisie la même chose).

Et je n'ai pas de clé à utiliser; si je le faisais, je penserais que ce serait dans la catégorie RTFM et ne mériterait pas une réponse sur SO.

EDIT:

Malheureusement, dans P3K, .items() retourne un objet dict_items, contrairement à Python 2 qui a retourné une iterator:

ActivePython 3.1.2.4 (ActiveState Software Inc.) based on 
Python 3.1.2 (r312:79147, Sep 14 2010, 22:00:46) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> d = {1:2} 
>>> k,v = next(d.items()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: dict_items object is not an iterator 
+1

Voulez-vous dire une version non destructive de '.popitem()'? – kennytm

+0

Que voulez-vous dire par «arbitraire»? Le ferez-vous plus d'une fois, et si oui, devrait-il être différent à chaque fois? – martineau

+0

Je peux le faire plus d'une fois; mais je vais parfaitement bien avoir la même valeur ou une valeur différente. – max

Répondre

4
k, v = next(iter(d.items())) # updated for Python 3 
+4

utilisateurs 2.x (par exemple à peu près tout le monde sauf l'OP), veillez à utiliser 'iteritems'. –

+0

@Glenn - exactement. Je l'ai d'abord écrit avec 'iteritems()', puis j'ai vu ce P3K et j'ai dû réfléchir aux nouveautés de P3K. – eumiro

+0

Merci ... J'ai commencé à apprendre Python, et supposé que je devrais choisir la dernière version .. :) – max

-1
import random 
k, v = random.choice(d.items()) 
+3

" Arbitraire "ne signifie pas" aléatoire ", il n'y a pas de raison pour une randomisation ici. –

+1

@Glen Maynard. Comment sais-tu ça? Obtenir un élément "arbitraire" est ce que 'get()' ou '[]' fait. Si cette utilisation triviale et évidente de 'get()' n'est pas la bonne réponse, alors il doit y avoir d'autres forces mystérieuses à l'œuvre. Comme aléatoire. –

+0

'get' et' [] 'récupèrent un élément * spécifique *, pas arbitraire, et ne sont pas pertinents parce que vous devez d'abord connaître une clé pour les utiliser. (Est-ce qu'il me demande vraiment comment je sais ce que le mot "arbitraire" signifie?) –

-1

pop est censé supprimer un élément. N'est-ce pas le sens de cette méthode?

Si vous souhaitez obtenir la clé aléatoire, paire de valeurs utiliser le module pseudo-aléatoire

>>> import random 
>>> x = {1:3, 4:5, 6:7} 
>>> x = {1:3, 4:5, 6:7, 'a':9, 'z':'x'} 
>>> k = random.choice(x.keys()) 
>>> x[k] 
7 
>>> 
+0

Voir le commentaire de @Glenn Maynard sur la réponse d'AndrewBC. – martineau

-1

La méthode items() renvoie la copie de la clé, des paires de valeurs de dictionnaire comme liste. Par exemple, >fruits_color = {'apple': 'red', 'banana': 'green'}
>fruits_color.items()
[('apple', 'red'), ('banana', 'green')]

Une fois que vous avez la liste, vous pouvez choisir les paires valeur/clé.

-1

Vous obtenez une paire de clés-va-là "arbitraire"?

k, v = k, d[k] 
+1

Mon problème est que je n'ai pas 'k' à ma disposition. J'ai donc besoin de quelque chose qui me donne 'k' et' v' à partir d'un dictionnaire. – max