559 votes

Accéder à un élément arbitraire dans un dictionnaire en Python

Si un mydict n'est pas vide, j'accède à un élément arbitraire comme :

mydict[mydict.keys()[0]]

Y a-t-il une meilleure façon de procéder ?

3 votes

Ce qu'il a dit ce n'est vraiment une question valable que s'il n'y a qu'un seul élément dans le dict, ou si vous ne vous souciez pas de celui que vous récupérez.

5 votes

Oui, j'ai juste besoin d'accéder à n'importe quel élément du dict, c'est pourquoi je veux accéder au premier élément.

2 votes

@Stan : mais comme Greg l'a dit, il n'y a pas de "premier" élément défini dans le dict. donc peut-être devriez-vous changer votre question, pour être clair.

657voto

doublep Points 9701

Sur Python 3, de manière non destructive et itérative :

next(iter(mydict.values()))

Sur Python 2, de manière non destructive et itérative :

mydict.itervalues().next()

Si vous voulez qu'il fonctionne à la fois dans Python 2 et 3, vous pouvez utiliser la fonction six paquet :

six.next(six.itervalues(mydict))

bien qu'à ce stade il soit assez cryptique et je préférerais votre code.

Si vous souhaitez supprimer un élément, faites-le :

key, value = mydict.popitem()

Notez que le terme "premier" n'est peut-être pas approprié ici car dict n'est pas un type ordonné dans Python < 3.6. Python 3.6 et plus dicts sont commandés.

36 votes

Tu ne veux pas dire dict.iterkeys().next() ?

12 votes

@John Machin : Eh bien, la question semble accéder à la valeur associée à la première clé, donc c'est ce que je fais également dans la réponse.

0 votes

Malheureusement, le code original, qui, je l'admets, est assez joli, ne fonctionne pas avec Python 3.

167voto

swK Points 121

Si vous n'avez besoin d'accéder qu'à un seul élément (étant le premier par hasard, puisque les dicts ne garantissent pas l'ordre), vous pouvez simplement le faire en Python 2 :

my_dict.keys()[0]     -> key of "first" element
my_dict.values()[0]   -> value of "first" element
my_dict.items()[0]    -> (key, value) tuple of "first" element

Veuillez noter que (à ma connaissance) Python ne garantit pas que deux appels successifs à l'une de ces méthodes renverront une liste avec le même ordre. Ceci n'est pas supporté avec Python3.

en Python 3 :

list(my_dict.keys())[0]     -> key of "first" element
list(my_dict.values())[0]   -> value of "first" element
list(my_dict.items())[0]    -> (key, value) tuple of "first" element

94 votes

Cela ne fonctionne que dans Python 2.x, pour 3.x vous devez utiliser list(my_dict.keys())[0]

7 votes

Alors, de quelle classe de complexité s'agit-il ? Certainement, list(my_dict.keys())[0] n'est pas paresseux ?

1 votes

Pour clarifier, ce que @alldayremix voulait dire avec ce commentaire est que dans python 3.x les résultats de my_dict.function() ne supportent pas l'indexation, c'est pourquoi nous devons d'abord le convertir en une liste et ensuite nous pouvons utiliser l'index [0].

61voto

69444091 Points 1

Dans python3, la méthode :

dict.keys() 

retourne une valeur de type : dict_keys(), on aura une erreur si on obtient le 1er membre des clés de dict de cette façon :

dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing

Enfin, j'ai converti dict.keys() en liste @1st, et j'ai obtenu le premier membre par la méthode list splice :

list(dict.keys())[0]

0 votes

C'est la solution la plus simple et elle fonctionne à la fois dans python2 et python3.

0 votes

Pour mon argent. Je dis que cette réponse est la plus intuitive

0 votes

Oui, mais cela ne répond pas à la question du PO, qui est de savoir comment accéder aux VALEURS, et non aux clés.

17voto

Alex Martelli Points 330805

Comme d'autres l'ont mentionné, il n'y a pas de "premier élément", puisque les dictionnaires n'ont pas d'ordre garanti (ils sont implémentés comme des tables de hachage). Si vous voulez, par exemple, la valeur correspondant à la plus petite clé, thedict[min(thedict)] le fera. Si vous vous souciez de l'ordre dans lequel les clés ont été insérées, c'est-à-dire que par "premier" vous voulez dire "inséré le plus tôt", alors en Python 3.1 vous pouvez utiliser collections.OrderedDict Pour les versions plus anciennes de Python, téléchargez, installez et utilisez le backport ordered dict (2.4 et plus) que vous trouverez à l'adresse suivante aquí .

Python 3.7 Maintenant Les dicts sont ordonnés par insertion.

11voto

Matt Joiner Points 29194

En ignorant les questions relatives à la dictée, cela pourrait être mieux :

next(dict.itervalues())

De cette façon, nous évitons la recherche d'éléments et la génération d'une liste de clés que nous n'utilisons pas.

Python3

next(iter(dict.values()))

2 votes

Values() fera une copie de toutes les valeurs (tout comme keys() pour les clés), ce qui rendra de nombreuses opérations O(n^2).

0 votes

Tout comme la version de l'OP ? Je vais changer cela pour utiliser un itérateur alors.

4 votes

Ceci ne concerne que Python 2. Pour Python 3, nous avons besoin de next(iter(dict.values())) pour obtenir le même résultat sans créer la liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X