web-dev-qa-db-fra.com

Python dictionary.keys ()

J'essaie d'utiliser la .keys() et au lieu d'obtenir une liste des clés comme toujours dans le passé. Cependant je comprends cela.

b = { 'video':0, 'music':23 }
k = b.keys()
print( k[0] )

>>>TypeError: 'dict_keys' object does not support indexing

print( k )
dict_keys(['music', 'video'])

il devrait simplement imprimer ["musique", "vidéo"] à moins que je ne devienne fou.

Que se passe-t-il?

42
tokageKitayama

Python 3 a changé le comportement de dict.keys tel qu'il renvoie maintenant un dict_keys objet, qui est itérable mais non indexable (c'est comme l'ancien dict.iterkeys, qui a disparu maintenant). Vous pouvez récupérer le résultat Python 2 avec un appel explicite à list:

>>> b = { 'video':0, 'music':23 }
>>> k = list(b.keys())
>>> k
['music', 'video']

ou juste

>>> list(b)
['music', 'video']
91
Fred Foo

Si vous avez affecté k comme ceci:

k = list(b.keys())

votre code fonctionnera.

Comme l'indique l'erreur, le dict_keys le type ne prend pas en charge l'indexation.

8
NPE

C'est l'un des changements les plus marquants entre Python 2 et 3.

Dans Python 2:

>>> help(dict.keys)
keys(...)
    D.keys() -> list of D's keys

Dans Python 3:

>>> help(dict.keys)
keys(...)
    D.keys() -> a set-like object providing a view on D's keys

Ce changement de comportement est très logique, car un dict est sémantiquement non ordonné et ses clés sont uniques - tout comme un ensemble.

Cette modification signifie que vous n'avez pas à créer une nouvelle liste de clés à chaque fois que vous souhaitez effectuer une sorte de comparaison avec les touches d'un dict.

Obtenir le même comportement en 2 et 3

Pour faciliter la transition vers Python 3, Python 2.7 a une autre méthode dict, viewkeys. La méthode viewkeys est la plus similaire à Python 3 dict.keys:

>>> d
{'a': None, 'c': None, 'b': None, 'd': None}
>>> for k in d.viewkeys(): print k
... 
a
c
b
d
>>> d.viewkeys() & set('abc')
set(['a', 'c', 'b'])

Dans Python 3, l'analogue le plus proche de l'ancien comportement est de passer dict.keys() à list:

>>> d
{'d': None, 'a': None, 'c': None, 'b': None}
>>> list(d.keys())
['d', 'a', 'c', 'b']

Ou passez simplement le dict à list, car un dict itérera de toute façon sur ses clés:

>>> list(d)
['d', 'a', 'c', 'b']

Vous pouvez créer un utilitaire pour résumer le comportement sur 2 et 3:

if hasattr(dict, 'viewkeys'): # Python 2.7
    def keys(d):
        return d.viewkeys()
else:  # Python 3
    def keys(d):
        return d.keys()

Et passez un dict à list pour obtenir le formulaire de liste, et en 2 et 3, vous obtiendrez la même sortie:

>>> d
{'b': None, 'a': None, 'c': None, 'd': None}
>>> keys(d)
dict_keys(['b', 'a', 'c', 'd'])
>>> list(d)
['b', 'a', 'c', 'd']
2
Aaron Hall

Si vous voulez simplement une liste de clés d'un dictionnaire, vous pouvez directement faire comme ceci:

b = {"name": "xyz", "class":"abc", "college": "qwert"}  
key_list = list(b)

key_list contiendra tous les noms de clés sous forme de liste, cependant, cela ne répétera pas une clé, si elle est trouvée plus d'une fois. Les clés en double seront comptées comme une seule.

0
vikas0713