L'accès dict_keys élément à l'index en Python3
J'essaye d'accéder à un dict_key de l'élément par son indice:
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 cela?
- Dans py3.x
dict.keys()
retourne un jeu comme objet de vue, pas de liste(donc, l'indexation n'est pas possible). Utilisationkeys = list(test)
- quand je fais la liste(something_dict), le n-uplet de l'ordre est aléatoire: exemple: liste({'toto': 'bar', 'bonjour': 'monde'}) peuvent retourne: liste(toto, bonjour) ou de la liste(bonjour, foo), pourquoi est-ce aléatoire?
- Dicts n'ont pas de ordonnance.(Utiliser
collections.OrderedDict
si vous voulez clés des commandes) - Intéressante discussion sur la sécurité des threads ici sur les différentes approches pour résoudre ce problème: blog.labix.org/2008/06/27/...
Vous devez vous connecter pour publier un commentaire.
Appel
list()
sur le dictionnaire à la place:En Python 3, le
dict.keys()
méthode retourne un dictionnaire de vue de l'objet, qui agit comme un ensemble. Itérer sur le dictionnaire directement donne aussi les clés, afin de tourner un dictionnaire dans la liste des résultats dans une liste de toutes les clés:dict
sous-classe, par exemple, où.keys()
est gérée dans le code Python (par exemple, un thread peut avoir lieu).list(dict)
vous donnera la liste dans l'ordre alphabétique.Pas une réponse complète, mais peut-être un indice utile. Si c'est vraiment le premier élément que vous souhaitez*, puis
est beaucoup plus rapide que
pour les grandes dicts, depuis le tout ne doit pas être stockées dans la mémoire.
De 10.000.000 d'articles que j'ai trouvé près de 40.000 fois plus rapide.
*Le premier élément dans le cas d'une dict à être juste un pseudo-élément aléatoire avant de Python 3.6 (après qu'il a commandé dans la norme de mise en œuvre, bien qu'il n'est pas conseillé de s'appuyer sur elle).
De manière classique ajoutant les clés d'un définis de manière statique liste et ensuite l'indexation à la même
ls = list(test.keys())
? Je trouve ça plus simple.Dans de nombreux cas, cela peut être un XY Problème. Pourquoi êtes-vous de l'indexation de votre dictionnaire des clés par la poste? Avez-vous vraiment besoin? Jusqu'à récemment, les dictionnaires n'ont même pas été commandé en Python, l'accès au premier élément est arbitraire.
J'ai juste traduit certains Python 2 code Python 3:
qui n'est pas assez, mais pas trop mauvais non plus. Au début, j'étais sur le point de le remplacer par le monstrueux
avant de comprendre que c'est beaucoup mieux écrit que
qui fonctionne très bien.
Je crois que dans beaucoup d'autres cas, l'indexation des clés de dictionnaire par la position peut être évitée. Bien que les dictionnaires sont commandés en Python 3.7, en s'appuyant sur ce n'est pas assez. Le code ci-dessus ne fonctionne que parce que le contenu de
some_list
a récemment été produites à partir du contenu ded
.Avoir un coup d'oeil dur à votre code si vous avez vraiment besoin d'accéder à un
disk_keys
élément à l'index. Peut-être que vous n'avez pas besoin d'.Autre approche serait d'utiliser une pandas Série comme ceci:
Cela pourrait être overkilling et pas très rapide, mais pour moi, c'est très clair et lisible.