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?
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'
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).
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.
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