web-dev-qa-db-fra.com

Comment indexer dans un dictionnaire?

J'ai un dictionnaire ci-dessous:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}

Comment indexer la première entrée du dictionnaire?

colors[0] retournera un KeyError pour des raisons évidentes.

60
Harpal

Les dictionnaires ne sont pas ordonnés dans les versions de Python, y compris Python 3.6. Si vous ne vous souciez pas de l'ordre des entrées et souhaitez quand même accéder aux clés ou aux valeurs par index, vous pouvez utiliser d.keys()[i] et d.values()[i] ou d.items()[i]. (Notez que ces méthodes créent une liste de toutes les clés, valeurs et éléments dans Python 2.x. Donc, si vous en avez besoin plusieurs fois, stockez la liste dans une variable pour améliorer les performances.)

Si vous vous souciez de l'ordre des entrées, à partir de Python 2.7, vous pouvez utiliser collections.OrderedDict . Ou utilisez une liste de paires

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]

si vous n'avez pas besoin d'un accès par clé. (Pourquoi vos chiffres sont-ils au fait?)

Dans Python 3.7, les dictionnaires normaux sont ordonnés. Vous n'avez donc plus besoin d'utiliser OrderedDict (mais vous pouvez toujours le faire - c'est essentiellement du même type). L'implémentation CPython de Python 3.6 incluait déjà ce changement, mais comme il ne fait pas partie des spécifications du langage, vous ne pouvez pas vous en fier à Python 3.6.

79
Sven Marnach

Si quelqu'un regarde encore cette question, la réponse actuellement acceptée est maintenant obsolète:

Depuis Python 3.6, les dictionnaires sont préservant l'ordre , c'est-à-dire qu'ils se comportent maintenant exactement comme collections.OrderedDicts. Malheureusement, il n’existe toujours pas de méthode dédiée pour indexer dans keys()/values() du dictionnaire. Il est donc possible d’obtenir la première clé/valeur du dictionnaire comme suit:

first_key = list(colors.keys())[0]
first_val = list(colors.values())[0]

ou bien alternativement (ceci évite d'instancier la vue des clés dans une liste):

def get_first_key(dictionary):
    for key in dictionary.keys():
        return key

first_key = get_first_key(colors)
first_val = colors[first_key]

Si vous avez besoin d'une n- ème clé, alors

def get_nth_key(dictionary, n=0):
    if n < 0:
        n += len(dictionary)
    for i, key in enumerate(dictionary.keys()):
        if i == n:
            return key
    raise IndexError("dictionary index out of range") 
49
Pasha

en fait, j'ai trouvé une nouvelle solution qui m'a vraiment aidé. Si vous êtes particulièrement intéressé par l'index d'une certaine valeur dans une liste ou un ensemble de données, vous pouvez simplement définir la valeur du dictionnaire sur cet index!

Regarde juste:

list = ['a', 'b', 'c']
dictionary = {}
counter = 0
for i in list:
   dictionary[i] = counter
   counter += 1

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2}

Maintenant, grâce à la puissance de hashmaps, vous pouvez extraire l'index de vos entrées en temps constant (autrement dit, beaucoup plus rapidement)

4
user3368835

S'adresser à un élément du dictionnaire, c'est comme s'asseoir sur un âne et profiter du trajet.

Comme règle de PythonDICTIONARY est sans commande

S'il y a

dic = {1: "a", 2: "aa", 3: "aaa"}

Maintenant, supposons que si je vais comme dic[10] = "b", alors ce ne sera pas toujours comme ça

dic = {1:"a",2:"aa",3:"aaa",10:"b"}

Il peut être comme

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}

Ou

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}

Ou

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}

Ou une telle combinaison.

Donc, la règle du pouce estDICTIONNAIREest sans commande !

4
Raj Damani

Si vous avez besoin d'un dictionnaire commandé, vous pouvez utiliser odict .

3
Utku Zihnioglu

Vous ne pouvez pas, puisque dict est non ordonné. vous pouvez utiliser .popitem() pour obtenir un élément arbitraire, mais cela le supprimera du dict.

1
import collections 

# Declaring namedtuple() 
dimensions = collections.namedtuple('colors',['blue','red','yellow']) 
S = dimensions('5','6','8')
# Access using index 
print ("The dimension of red using index is : ",end ="") 
print (S[1]) 
# Access using name  
print ("The dimension of red using keyname is : ",end ="") 
print (S.red) 
# Access using getattr() 
print ("The dimension of red  using getattr() is : ",end ="") 
print (getattr(S,'red')) 
1
user1464878

oh, c'est un dur. En gros, vous avez deux valeurs pour chaque élément. Ensuite, vous essayez de les appeler avec un numéro comme clé. Malheureusement, l'une de vos valeurs est déjà définie comme clé!

Essaye ça:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

Vous pouvez maintenant appeler les touches par leur numéro, comme si elles étaient indexées comme une liste. Vous pouvez également référencer la couleur et le numéro en fonction de leur position dans la liste.

Par exemple,

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

Bien sûr, vous devrez trouver un autre moyen de garder une trace de l'emplacement de chaque couleur. Peut-être pouvez-vous avoir un autre dictionnaire qui stocke la clé de chaque couleur comme valeur.

colors_key = {'blue': 1, 'red': 6, 'yllow': 8}

Ensuite, vous pourrez également rechercher la clé de couleurs si nécessaire.

couleurs [colors_key ['blue']] [0] retournera 'blue'

Quelque chose comme ca.

Et puis, pendant que vous y êtes, vous pouvez créer un dict avec les valeurs numériques comme clés afin que vous puissiez toujours les utiliser pour rechercher vos couleurs, vous savez, si vous en avez besoin.

valeurs = {5: [1, 'bleu'], 6: [2, 'rouge'], 8: [3, 'jaune']}

Ensuite, (couleurs [couleurs [clé [valeurs] [5] [1]]] [0]) renverra «bleu».

Ou vous pouvez utiliser une liste de listes.

Bonne chance!

1
Godfreyluck

Les dictionnaires ne sont pas des listes.

avec des listes que vous pouvez simplement faire enter foo[0] here pour obtenir cette valeur.

les dicts ont des fonctions .value et .keys ().

Il est également plus judicieux d’utiliser try/except chaque fois que vous parcourez un dict.

0
RichieKing

La structure des données du dictionnaire n'étant pas ordonnée, vous ne pouvez pas indexer la première entrée du dictionnaire, alors que nous pouvons indexer les valeurs du dictionnaire. 

new_dict= {'first': 'Meghshyam', 'second': 'Sonar', 'third': '1993'}

# ci-dessus, le dictionnaire contient trois valeurs.

#fullowing code write index la première valeur du dictionnaire en utilisant la clé

new_dict['first'][0]

#nous indexons simplement la première lettre de la valeur en utilisant la clé correspondante. 

J'espère que cela efface le concept. 

0
Meghshyam Sonar