web-dev-qa-db-fra.com

Accéder à l'élément dict_keys par index en Python3

J'essaie d'accéder à un élément de dict_key par son index:

test = {'foo': 'bar', 'hello': 'world'}
keys = test.keys()  # dict_keys object

keys.index(0)
AttributeError: 'dict_keys' object has no attribute 'index'

Je veux obtenir foo.

même avec:

keys[0]
TypeError: 'dict_keys' object does not support indexing

Comment puis-je faire ceci?

98
fj123x

Appelez list() sur le dictionnaire à la place:

keys = list(test)

Dans Python 3, la méthode dict.keys()] renvoie un objet de vue du dictionnaire , qui agit comme un ensemble. En itérant directement dans le dictionnaire, vous obtiendrez également des clés, alors transformer un dictionnaire en une liste résulte en une liste de toutes les clés:

>>> test = {'foo': 'bar', 'hello': 'world'}
>>> list(test)
['foo', 'hello']
>>> list(test)[0]
'foo'
115
Martijn Pieters

Pas une réponse complète mais peut-être un indice utile. Si c'est vraiment le premier article que vous voulez *, alors

next(iter(q))

est beaucoup plus rapide que

list(q)[0]

pour les gros dict, puisque tout ne doit pas être stocké en mémoire.

Pour 10.000.000 articles, j'ai trouvé que c'était presque 40.000 fois plus rapide.

* Le premier élément dans le cas où un dict est juste un élément pseudo-aléatoire avant Python 3.6 (après cela, il est commandé dans l'implémentation standard, bien qu'il ne soit pas conseillé de s'en fier).

45
Mark

Dans de nombreux cas, il peut s’agir d’un problème XY . Pourquoi indexez-vous les clés de votre dictionnaire par position? Avez-vous vraiment besoin de Jusqu'à récemment, les dictionnaires n'étaient même pas ordonnés en Python, l'accès au premier élément était donc arbitraire.

Je viens de traduire du code Python 2 en Python 3:

keys = d.keys()
for (i, res) in enumerate(some_list):
    k = keys[i]
    # ...

ce qui n'est pas joli, mais pas très mal non plus. Au début, j'étais sur le point de le remplacer par le monstrueux

    k = next(itertools.islice(iter(keys), i, None))

avant que je réalise cela est beaucoup mieux écrit

for (k, res) in Zip(d.keys(), some_list):

qui fonctionne très bien.

Je crois que dans beaucoup d'autres cas, l'indexation des clés de dictionnaire par position peut être évitée. Bien que les dictionnaires soient classés dans Python 3.7, il n’est pas utile de s’en remettre à cela. Le code ci-dessus ne fonctionne que parce que le contenu de some_list avait été récemment produit à partir du contenu de d.

Examinez attentivement votre code si vous devez vraiment accéder à un disk_keys élément par index. Peut-être que vous n'en avez pas besoin.

0
gerrit
test = {'foo': 'bar', 'hello': 'world'}
ls = []
for key in test.keys():
    ls.append(key)
print(ls[0])

Manière conventionnelle d’ajouter les clés à une liste définie de manière statique puis de l’indexer pour la même

0
pranav dua