web-dev-qa-db-fra.com

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

Si une mydict n'est pas vide, j'accède à un élément arbitraire de la manière suivante:

mydict[mydict.keys()[0]]

Y a-t-il une meilleure façon de faire cela?

396
Stan

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 que cela fonctionne à la fois en Python 2 et 3, vous pouvez utiliser le paquetage six:

six.next(six.itervalues(mydict))

mais à ce stade, il est assez cryptique et je préférerais préférer votre code.

Si vous souhaitez supprimer un élément, procédez comme suit:

key, value = mydict.popitem()

Notez que "premier" n'est pas un terme approprié ici. Il s'agit d'un élément "quelconque", car dict n'est pas un type ordonné.

481
doublep

Si vous n'avez besoin d'accéder qu'à un seul élément (le premier par hasard, car les dict ne garantissent pas la commande), vous pouvez simplement le faire dans 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 2 appels successifs à l'une de ces méthodes renverront une liste avec le même ordre. Ceci n'est pas supporté avec Python3.

111
swK

En python3, le chemin:

dict.keys() 

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

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

Enfin, je convertis dict.keys () en lister le 1er et obtient le premier membre par la méthode de splice list:

list(dict.keys())[0]
48
69444091

obtenir une clé

next(iter(mydict))

pour obtenir une valeur

next(iter(mydict.values()))

pour obtenir les deux

next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2

Les deux premiers sont Python 2 et 3. Les deux derniers sont paresseux en Python 3, mais pas en Python 2.

23
maxbellec

Comme d'autres l'ont mentionné, il n'y a pas de "premier élément", car les dictionnaires n'ont pas d'ordre garanti (ils sont implémentés sous forme de 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, vous entendez par "d'abord" le plus ancien inséré, puis dans Python 3.1, vous pouvez utiliser collections.OrderedDict , qui figure également dans le prochain Python 2.7; pour les anciennes versions de Python, téléchargez, installez et utilisez le backport dict commandé (2.4 et versions ultérieures) dans lequel vous pouvez trouver ici .

Python 3.7Maintenant dicts sont classés par ordre d'insertion.

16
Alex Martelli

Que dis-tu de ça. Pas encore mentionné ici.

py 2 & 3

a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2
13
animaacija

En ignorant les problèmes liés à l'ordre des dict, 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()))
10
Matt Joiner

En python3 

list(dict.values())[0]
7
Oleg Matei

Pour les deux Python 2 et 3:

import six

six.next(six.itervalues(d))
3
oblalex

Vous pouvez toujours faire:

for k in sorted(d.keys()):
    print d[k]

Cela vous donnera un ensemble de clés cohérent (en ce qui concerne intégré. Hash (), vous pouvez le traiter) si le tri a un sens pour vous. Cela signifie par exemple que les types numériques sont triés de manière cohérente même si vous développez le dictionnaire.

EXEMPLE

# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())

# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())

# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'Apple pie'
print d.keys()
print sorted(d.keys())

Notez que le dictionnaire est trié lors de l'impression. Mais la clé est essentiellement un hashmap!

3
Philipp Meier

manière la plus simple pour python3:

list(dict.keys())[0]
2
arispen

Une mise à jour de la réponse de @ swK, basée sur le commentaire de @alldayremix:

Dans Python 3, utilisez:

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
2
Qaswed

Pas de bibliothèques externes, fonctionne à la fois sur Python 2.7 et 3.x:

>>> list(set({"a":1, "b": 2}.values()))[0]
1

Pour la clé aribtrary, laissez simplement .values ​​()

>>> list(set({"a":1, "b": 2}))[0]
'a'
1
Thomas Browne
first_key, *rest_keys = mydict
0
user1994083

Le sous-classement dict est une méthode, même s’il n’est pas efficace. Ici, si vous fournissez un entier, il retournera d[list(d)[n]], sinon accédez au dictionnaire comme prévu:

class mydict(dict):
    def __getitem__(self, value):
        if isinstance(value, int):
            return self.get(list(self)[value])
        else:
            return self.get(value)

d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
            'e': 'test', 'f': 'dictionary', 'g': 'testing'})

d[0]    # 'hello'
d[1]    # 'this'
d['c']  # 'is'
0
jpp