Comment trouvez-vous la première clé d'un dictionnaire?

200

J'essaie d'obtenir mon programme à imprimer à "banana"partir du dictionnaire. Quelle serait la façon la plus simple de procéder?

Voici mon dictionnaire:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}
slagoy
la source
35
Les dictionnaires en Python ne sont pas classés, il n'y a donc pas de "première clé". Voir ici
David Robinson
2
Voulez-vous imprimer littéralement le mot "banane" ou la valeur associée à "banane" (4, dans ce cas)?
Paul H
to print out banana with a FOR loop, so when I run it, each key would also be printed outTu veux dire for k in prices: print k? Cela imprimera toutes les clés du dictionnaire.
David Robinson,
7
au premier commentaire: en python 3.6+ les dictionnaires sont commandés (voir stackoverflow.com/questions/39980323/… )
Egirus Ornila

Réponses:

284

Sur une version Python où les dictés sont réellement commandés, vous pouvez faire

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

Pour que les dicts soient commandés, vous avez besoin de Python 3.7+, ou 3.6+ si vous êtes d'accord pour vous fier à la nature ordonnée techniquement et en détail de l'implémentation des dicts sur Python 3.6.

Pour les versions antérieures de Python, il n'y a pas de "première clé".

maxbellec
la source
29
Si vous voulez à la fois la clé et la valeur dans Python 3:next(iter( my_dict.items() ))
Jonathan H
Les dictés @RyanHaining Python sont classés par insertion à partir de CPython 3.6 et de toute autre implémentation Python commençant par Python 3.7
Boris
1
cette réponse a foiré ma session de débogage que j'ai attendue 6 heures pour arriver au point d'arrêt. C'est très vexant.
Michael
128

Un dictionnaire n'est pas indexé, mais il est en quelque sorte ordonné. Ce qui suit vous donnerait la première clé existante:

list(my_dict.keys())[0]
ylnor
la source
25
Cela ne serait-il pas plus simple à mettre, list(my_dict)[0]car il récupérera de toute façon la liste des clés?
Jean-Francois
@ Jean-FrancoisT. oui
Ryan Haining
Les dictionnaires sont désormais commandés dans CPython 3.6 et toutes les autres implémentations Python commençant par Python 3.7
Boris
53

Mise à jour: à partir de Python 3.7, l'ordre d'insertion est maintenu, vous n'avez donc pas besoin d'un OrderedDictici. Vous pouvez utiliser les approches ci-dessous avec undict

Modifié dans la version 3.7: l' ordre du dictionnaire est garanti comme étant l'ordre d'insertion. Ce comportement était un détail d'implémentation de CPython à partir de 3.6.

la source


Python 3.6 et versions antérieures *

Si vous parlez d'un habitué dict, la "première clé" ne veut rien dire. Les clés ne sont pas commandées de quelque manière que ce soit sur laquelle vous pouvez compter. Si vous parcourez votre, dictvous n'obtiendrez probablement pas "banana"la première chose que vous voyez.

Si vous devez garder les choses en ordre, vous devez utiliser un OrderedDictdictionnaire et pas seulement un simple.

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

Si vous vouliez ensuite voir toutes les clés pour pouvoir le faire en les itérant

for k in prices:
    print(k)

Vous pouvez également mettre toutes les clés dans une liste, puis travailler avec

ks = list(prices)
print(ks[0]) # will print "banana"

Un moyen plus rapide d'obtenir le premier élément sans créer de liste serait d'appeler nextl'itérateur. Cela ne se généralise pas bien quand on essaie d'obtenir l' nthélément

>>> next(iter(prices))
'banana'

* CPython avait garanti l'ordre d'insertion comme détail d'implémentation dans 3.6.

Ryan Haining
la source
Merci pour le conseil. Je suis désolé de ne pas avoir été plus clair. J'essaie juste de trouver le code qui me permettra d'imprimer "Banana" PAS la valeur qui lui est associée. Merci pour toute la contribution!
slagoy
31

Pour Python 3 ci-dessous, élimine la surcharge de conversion de liste:

first = next(iter(prices.values()))
Shital Shah
la source
10

Le dicttype est un mappage non ordonné , il n'y a donc pas de "premier" élément.

Ce que vous voulez, c'est probablement collections.OrderedDict.


la source
ou un tuple nommé peut-être s'il est immuable
Joran Beasley
Cela a changé depuis Python 3.6. Les dictionnaires sont désormais commandés.
misantroop
1
Eh bien techniquement, vous voulez le premier élément des clés du dictionnaire si vous êtes certain, il n'y a qu'une seule clé.
DBX12
on pourrait dire le premier élément en itérant sur un dict qui est fixe. Mais bonne chance pour trouver celui-là.
Demongolem
6

J'ai donc trouvé cette page en essayant d'optimiser une chose pour prendre la seule clé dans un dictionnaire de longueur connue 1 et ne retourner que la clé. Le processus ci-dessous a été le plus rapide pour tous les dictionnaires que j'ai essayés jusqu'à la taille 700.

J'ai essayé 7 approches différentes et j'ai trouvé que celle-ci était la meilleure sur mon Macbook 2014 avec Python 3.6:

def first_5():
    for key in biased_dict:
        return key

Les résultats du profilage étaient:

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7

Toutes les approches que j'ai essayées sont ici:

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key
turiyag
la source
1
Donc, faire une boucle for et retourner la première clé (first_5) est en fait la plus rapide que je puisse voir? Aussi une belle comparaison des différentes approches.
PiMathCLanguage
1
oui, et pas seulement le plus rapide, mais le plus rapide d'un mile de pays. Aussi le plus facile à lire, facilement.
turiyag
4

Et bien aussi simple, la réponse selon moi sera

first = list(prices)[0]

la conversion du dictionnaire en liste produira les clés et nous sélectionnerons la première clé de la liste.

narwanimonish
la source
Pour python3, il n'est pas nécessaire de créer une toute nouvelle liste pour récupérer uniquement son premier élément. Meilleure utilisation next(iter(prices)), comme déjà suggéré par d'autres réponses.
normanius
1

Comme beaucoup d'autres l'ont souligné, il n'y a pas de première valeur dans un dictionnaire. Leur tri est arbitraire et vous ne pouvez pas compter sur le même tri chaque fois que vous accédez au dictionnaire. Cependant, si vous souhaitez imprimer les clés de plusieurs manières:

for key, value in prices.items():
    print(key)

Cette méthode utilise l'affectation de tuple pour accéder à la clé et à la valeur. C'est pratique si vous devez accéder à la fois à la clé et à la valeur pour une raison quelconque.

for key in prices.keys():
    print(key)

Cela ne donne accès aux clés que la keys()méthode implique.

kylie.a
la source
1

d.keys () [0] pour obtenir la clé individuelle.

Mise à jour: - @AlejoBernardin, je ne sais pas pourquoi vous avez dit que cela ne fonctionnait pas. ici j'ai vérifié et cela a fonctionné. importer des collections

prices  = collections.OrderedDict((

    ("banana", 4),
    ("apple", 2),
    ("orange", 1.5),
    ("pear", 3),
))
prices.keys()[0]

'banane'

Amit Sharma
la source
Compte tenu du nombre de votes, pourquoi n'est-ce pas la meilleure bonne solution?
GuSuku
18
Cela fonctionne en python2 mais pas en python3. En python3, dict.keys()retourne a 'dict_keys' objectau lieu de a list, qui ne prend pas en charge l'indexation.
mavix
TypeError: l'objet 'dict_keys' ne prend pas en charge l'indexation
anilbey
0

Utilisez une boucle for qui couvre toutes les clés dans prices:

for key, value in prices.items():
     print key
     print "price: %s" %value

Assurez - vous que vous changez prices.items()de prices.iteritems()si vous utilisez Python 2.x

Mark M
la source
0

Si vous voulez juste la première clé d'un dictionnaire, vous devez utiliser ce que beaucoup ont suggéré auparavant

first = next(iter(prices))

Cependant, si vous voulez le premier et garder le reste sous forme de liste, vous pouvez utiliser l'opérateur de décompression des valeurs

first, *rest = prices

La même chose s'applique aux valeurs en remplaçant pricespar prices.values()et pour la clé et la valeur, vous pouvez même utiliser l'affectation de déballage

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

Remarque: Vous pourriez être tenté d'utiliser first, *_ = pricesjuste pour obtenir la première clé, mais je déconseille généralement cette utilisation à moins que le dictionnaire soit très court car il boucle sur toutes les clés et crée une liste pour le resta une surcharge.

Remarque: Comme mentionné par d'autres, l'ordre d'insertion est conservé à partir de python 3.7 (ou techniquement 3.6) et au-dessus, tandis que les implémentations antérieures doivent être considérées comme un ordre non défini.

wihlke
la source
-3

le moyen le plus simple est:

first_key = my_dict.keys()[0]

mais parfois vous devez être plus prudent et vous assurer que votre entité est une liste précieuse donc:

first_key = list(my_dict.keys())[0]
nasim seifi
la source
3
Il lève TypeError: 'dict_keys' object is not subscriptable, au moins avec Python 3.8
Eerik Sven Puudist