Comment imprimer la clé d'un dictionnaire?

213

Je voudrais imprimer une clé de dictionnaire Python spécifique:

mydic = {}
mydic['key_name'] = 'value_name'

Je peux maintenant vérifier si mydic.has_key('key_name'), mais ce que je voudrais faire, c'est imprimer le nom de la clé 'key_name'. Bien sûr, je pourrais utiliser mydic.items(), mais je ne veux pas que toutes les clés soient répertoriées, juste une clé spécifique. Par exemple, je m'attendrais à quelque chose comme ça (en pseudo-code):

print "the key name is", mydic['key_name'].name_the_key(), "and its value is", mydic['key_name']

Existe-t-il une name_the_key()méthode pour imprimer un nom de clé?


Edit: OK, merci beaucoup les gars pour vos réactions! :) Je réalise que ma question n'est pas bien formulée et banale. Je suis juste devenu confus parce que j'ai réalisé key_name et que ce mydic['key_name']sont deux choses différentes et j'ai pensé qu'il serait incorrect d'imprimer le key_namecontexte du dictionnaire. Mais en effet, je peux simplement utiliser le 'nom_clé' pour faire référence à la clé! :)

Benjamin
la source
19
Si vous savez quelle est la clé spécifique que vous voulez, euh, vous savez déjà ce qu'est la clé.
Wooble

Réponses:

382

Un dictionnaire a, par définition, un nombre arbitraire de clés. Il n'y a pas "la clé". Vous avez la keys()méthode, qui vous donne un python listde toutes les clés, et vous avez la iteritems()méthode, qui renvoie des paires clé-valeur, donc

for key, value in mydic.iteritems() :
    print key, value

Version Python 3:

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

Vous avez donc une poignée sur les touches, mais elles ne signifient vraiment le sens que si elles sont couplées à une valeur. J'espère avoir compris votre question.

juanchopanza
la source
1
Bien que cela fonctionne parfaitement pour moi dans Python 2.7, quelle est l'alternative dans Py3k? Je sais qu'il .iteritems()n'est plus pris en charge ...
piperchester
5
@PolyShell l'alternative en python 3, si c'est ce que vous entendez par Py3k (je suis loin de python depuis un moment maintenant) .items(). J'ai ajouté un exemple.
juanchopanza
1
@Bibhas Ils fonctionnent tous les deux, mais la sémantique est différente. items()renvoie une liste en python 2.x.
juanchopanza
73

De plus, vous pouvez utiliser ....

print(dictionary.items()) #prints keys and values
print(dictionary.keys()) #prints keys
print(dictionary.values()) #prints values
le maçon
la source
Merci! C'est exactement ce que je cherchais :)
Masoud Maleki
34

Hmm, je pense que ce que vous voudrez peut-être faire est d'imprimer toutes les clés du dictionnaire et leurs valeurs respectives?

Si oui, vous voulez ce qui suit:

for key in mydic:
  print "the key name is" + key + "and its value is" + mydic[key]

Assurez-vous également d'utiliser les «+» au lieu de «». La virgule mettra chacun de ces éléments sur une ligne distincte je pense, où comme plus les mettra sur la même ligne.

Dominic Santos
la source
2
la virgule les laissera sur la même ligne, mais insérera des espaces entre "is"et keyetc. Si vous utilisez, +vous devez mettre le rembourrage supplémentaire dans les chaînes. De plus, la clé et la valeur ne sont pas nécessairement des chaînes, auquel cas la virgule utilisera str (clé) et str (valeur) alors que +cela provoquera une erreur
John La Rooy
1
C'est la seule réponse dont je sais qu'elle n'est pas correcte, car l'OP a dit: "Je ne veux pas que toutes les clés soient répertoriées."
Ned Batchelder
Pour une raison quelconque, je pensais le contraire pour la virgule; vous avez raison là-dessus. J'ai également relu la question, il semble que nous ayons tous les deux mis «tous» en gras - ma mauvaise.
Dominic Santos
32
dic = {"key 1":"value 1","key b":"value b"}

#print the keys:
for key in dic:
    print key

#print the values:
for value in dic.itervalues():
    print value

#print key and values
for key, value in dic.iteritems():
    print key, value

Remarque: Dans Python 3, dic.iteritems () a été renommé en dic.items ()

ademar111190
la source
25

Le nom de la clé 'key_name' est donc key_name, print 'key_name'ou n'importe quelle variable que vous avez représentant.

zenna
la source
10

En Python 3:

# A simple dictionary
x = {'X':"yes", 'Y':"no", 'Z':"ok"}

# To print a specific key (for example key at index 1)
print([key for key in x.keys()][1])

# To print a specific value (for example value at index 1)
print([value for value in x.values()][1])

# To print a pair of a key with its value (for example pair at index 2)
print(([key for key in x.keys()][2], [value for value in x.values()][2]))

# To print a key and a different value (for example key at index 0 and value at index 1)
print(([key for key in x.keys()][0], [value for value in x.values()][1]))

# To print all keys and values concatenated together
print(''.join(str(key) + '' + str(value) for key, value in x.items()))

# To print all keys and values separated by commas
print(', '.join(str(key) + ', ' + str(value) for key, value in x.items()))

# To print all pairs of (key, value) one at a time
for e in range(len(x)):
    print(([key for key in x.keys()][e], [value for value in x.values()][e]))

# To print all pairs (key, value) in a tuple
print(tuple(([key for key in x.keys()][i], [value for value in x.values()][i]) for i in range(len(x))))
Fouad Boukredine
la source
8

Puisque nous essayons tous de deviner ce que "imprimer un nom de clé" pourrait signifier, je vais essayer. Vous souhaitez peut-être une fonction qui prend une valeur dans le dictionnaire et trouve la clé correspondante? Une recherche inversée?

def key_for_value(d, value):
    """Return a key in `d` having a value of `value`."""
    for k, v in d.iteritems():
        if v == value:
            return k

Notez que de nombreuses clés peuvent avoir la même valeur, donc cette fonction renvoie une clé ayant la valeur, peut-être pas celle que vous vouliez.

Si vous devez le faire fréquemment, il serait judicieux de construire le dictionnaire inversé:

d_rev = dict(v,k for k,v in d.iteritems())
Ned Batchelder
la source
Notez (comme ci-dessus) que les éléments sont devenus simplement des «éléments» dans Python 3.
Mike
Attention: si vous passez iteritemsà items, alors comme indiqué à l'origine, cette réponse ne renverra que la première clé - s'il existe plusieurs correspondances. Pour résoudre ce problème, créez une liste vide avant le for loop( values_list = []), puis ajoutez des clés à cette liste ( values_list.append(k)), dans la ifboucle. Enfin, déplacez l'instruction return ( return values_list) en dehors de la forboucle.
Victoria Stuart
4

Ou vous pouvez le faire de cette manière:

for key in my_dict:
     print key, my_dict[key]
Eugene Soldatov
la source
4
# highlighting how to use a named variable within a string:
mapping = {'a': 1, 'b': 2}

# simple method:
print(f'a: {mapping["a"]}')
print(f'b: {mapping["b"]}')

# programmatic method:
for key, value in mapping.items():
    print(f'{key}: {value}')

# yields:
# a 1
# b 2

# using list comprehension
print('\n'.join(f'{key}: {value}' for key, value in dict.items()))


# yields:
# a: 1
# b: 2

Edit: mis à jour pour les chaînes f de python 3 ...

Brian Bruggeman
la source
3

Assurez-vous de faire

dictionary.keys()
# rather than
dictionary.keys
Crt
la source
2

Quel est le problème avec l'utilisation à la 'key_name'place, même s'il s'agit d'une variable?

Ry-
la source
2
import pprint
pprint.pprint(mydic.keys())
Matt Joiner
la source
1
dict = {'name' : 'Fred', 'age' : 100, 'employed' : True }

# Choose key to print (could be a user input)
x = 'name'

if x in dict.keys():
    print(x)
Rob Wilson
la source
1

Probablement le moyen le plus rapide de récupérer uniquement le nom de la clé:

mydic = {}
mydic['key_name'] = 'value_name'

print mydic.items()[0][0]

Résultat:

key_name

Convertit le dictionaryen un listpuis il répertorie le premier élément qui est le tout dictpuis il répertorie la première valeur de cet élément qui est:key_name

Fekete Sumér
la source
Pourquoi récupérer la valeur aussi?
Martijn Pieters
1

J'ai recherché cette question, car je voulais savoir comment récupérer le nom de "la clé" si mon dictionnaire n'avait qu'une seule entrée. Dans mon cas, la clé m'était inconnue et pouvait être un certain nombre de choses. Voici ce que j'ai trouvé:

dict1 = {'random_word': [1,2,3]}
key_name = str([key for key in dict1]).strip("'[]'")        
print(key_name)  # equal to 'random_word', type: string.
PeaWagon
la source
0

Essaye ça:

def name_the_key(dict, key):
    return key, dict[key]

mydict = {'key1':1, 'key2':2, 'key3':3}

key_name, value = name_the_key(mydict, 'key2')
print 'KEY NAME: %s' % key_name
print 'KEY VALUE: %s' % value
fdb
la source
0
key_name = '...'
print "the key name is %s and its value is %s"%(key_name, mydic[key_name])
Don
la source
0

Si vous souhaitez obtenir la clé d'une valeur unique, les éléments suivants pourraient vous aider:

def get_key(b): # the value is passed to the function
    for k, v in mydic.items():
        if v.lower() == b.lower():
            return k

De manière pythonique:

c = next((x for x, y in mydic.items() if y.lower() == b.lower()), \
     "Enter a valid 'Value'")
print(c)
Jeril
la source
0

J'ajoute cette réponse car l'une des autres réponses ici ( https://stackoverflow.com/a/5905752/1904943 ) est datée (Python 2; iteritems), et le code présenté - s'il est mis à jour pour Python 3 selon la suggestion solution de contournement dans un commentaire à cette réponse - échoue silencieusement à renvoyer toutes les données pertinentes.


Contexte

J'ai quelques données métaboliques, représentées dans un graphe (nœuds, arêtes, ...). Dans une représentation par dictionnaire de ces données, les clés sont de la forme (604, 1037, 0)(représentant les nœuds source et cible, et le type de bord), avec des valeurs de la forme5.3.1.9 (représentant les codes enzymatiques EC).

Rechercher des clés pour des valeurs données

Le code suivant trouve correctement mes clés, avec des valeurs données:

def k4v_edited(my_dict, value):
    values_list = []
    for k, v in my_dict.items():
        if v == value:
            values_list.append(k)
    return values_list

print(k4v_edited(edge_attributes, '5.3.1.9'))
## [(604, 1037, 0), (604, 3936, 0), (1037, 3936, 0)]

alors que ce code ne renvoie que les premières clés (éventuellement de plusieurs correspondances):

def k4v(my_dict, value):
    for k, v in my_dict.items():
        if v == value:
            return k

print(k4v(edge_attributes, '5.3.1.9'))
## (604, 1037, 0)

Le code - ci, mis à jour en remplaçant naïve iteritemsavec items, ne retourne pas (604, 3936, 0), (1037, 3936, 0.

Victoria Stuart
la source
0

Pour accéder aux données, vous devez procéder comme suit:

foo = {
    "foo0": "bar0",
    "foo1": "bar1",
    "foo2": "bar2",
    "foo3": "bar3"
}
for bar in foo:
  print(bar)

Ou, pour accéder à la valeur que vous venez d'appeler à partir de la clé: foo[bar]

mmendescortes
la source