¿Cómo imprimir la clave de un diccionario?

213

Me gustaría imprimir una clave de diccionario Python específica:

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

Ahora puedo verificar si mydic.has_key('key_name'), pero lo que me gustaría hacer es imprimir el nombre de la clave 'key_name'. Por supuesto que podría usar mydic.items(), pero no quiero que se enumeren todas las claves, solo una clave específica. Por ejemplo, esperaría algo como esto (en pseudocódigo):

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

¿Hay algún name_the_key()método para imprimir un nombre clave?


Editar: OK, muchas gracias por sus reacciones! :) Me doy cuenta de que mi pregunta no está bien formulada y es trivial. Me confundí porque me di cuenta de key_name y mydic['key_name']son dos cosas diferentes y pensé que sería incorrecto imprimir key_namefuera del contexto del diccionario. Pero, de hecho, ¡simplemente puedo usar 'key_name' para referirme a la clave! :)

Benjamín
fuente
19
Si sabe cuál es la clave específica que desea, umm, ya sabe cuál es la clave.
Wooble

Respuestas:

382

Un diccionario tiene, por definición, un número arbitrario de claves. No hay "la clave". Tienes el keys()método, que te da una pitón listde todas las claves, y tienes el iteritems()método, que devuelve pares clave-valor, así que

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

Versión de Python 3:

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

Por lo tanto, tiene un control sobre las teclas, pero solo significan sentido si se combinan con un valor. Espero haber entendido tu pregunta.

juanchopanza
fuente
1
Aunque esto funcionó maravillosamente para mí en Python 2.7, ¿cuál es la alternativa en Py3k? Sé .iteritems()que ya no es compatible ...
piperchester
55
@PolyShell la alternativa en Python 3, si eso es lo que quieres decir con Py3k (he estado lejos de Python por un tiempo ahora) .items(). Agregué un ejemplo.
juanchopanza
1
@Bibhas Ambos funcionan, pero la semántica es diferente. items()devuelve una lista en python 2.x.
juanchopanza
73

Además puedes usar ....

print(dictionary.items()) #prints keys and values
print(dictionary.keys()) #prints keys
print(dictionary.values()) #prints values
Masón
fuente
¡Gracias! Esto es exactamente lo que estaba buscando :)
Masoud Maleki
34

Hmm, creo que lo que querrás hacer es imprimir todas las claves del diccionario y sus valores respectivos.

Si es así, quieres lo siguiente:

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

Asegúrate de usar también '+' en lugar de '. La coma colocará cada uno de esos elementos en una línea separada, creo, donde además los colocará en la misma línea.

Dominic Santos
fuente
2
la coma los dejará en la misma línea, pero inserta espacios entre "is"y keyetc. Si lo usa +, debe colocar el relleno adicional en las cadenas. Además, la clave y el valor no son necesariamente una cadena, en cuyo caso la coma usará str (clave) y str (valor) mientras +que causará un error
John La Rooy
1
Esta es la única respuesta que sé que no es correcta, ya que el OP dijo: "No quiero que se enumeren todas las claves".
Ned Batchelder
Por alguna razón, pensé lo contrario para la coma; tienes razón en eso. También volví a leer la pregunta, parece que ambos hemos puesto 'todo' en negrita, lo malo.
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

Nota: En Python 3, dic.iteritems () fue renombrado como dic.items ()

ademar111190
fuente
25

El nombre de la clave 'key_name' es key_name, por print 'key_name'lo tanto, o cualquier variable que tenga que lo represente.

zenna
fuente
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
fuente
8

Como todos estamos tratando de adivinar lo que podría significar "imprimir un nombre clave", lo intentaré. ¿Quizás desee una función que tome un valor del diccionario y encuentre la clave correspondiente? ¿Una búsqueda inversa?

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

Tenga en cuenta que muchas teclas pueden tener el mismo valor, por lo que esta función devolverá alguna tecla que tenga el valor, tal vez no la que deseaba.

Si necesita hacer esto con frecuencia, tendría sentido construir el diccionario inverso:

d_rev = dict(v,k for k,v in d.iteritems())
Ned Batchelder
fuente
Tenga en cuenta (como se indicó anteriormente) que los ítems se convirtieron simplemente en 'elementos' en Python 3.
Mike
Precaución: si cambia iteritemsa items, entonces, como se mostró originalmente, esta respuesta solo devolverá la primera clave, si hay varias coincidencias. Para resolver esto, cree una lista en blanco antes de for loop( values_list = []), luego agregue claves a esta lista ( values_list.append(k)), en el ifbucle. Por último, mueva la declaración de retorno ( return values_list) fuera del forbucle.
Victoria Stuart
4

O puedes hacerlo de esa manera:

for key in my_dict:
     print key, my_dict[key]
Eugene Soldatov
fuente
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

Editar: actualizado para las cadenas f de python 3 ...

Brian Bruggeman
fuente
3

Asegúrate de hacer

dictionary.keys()
# rather than
dictionary.keys
Crt
fuente
2

¿Qué hay de malo en usar 'key_name', incluso si es una variable?

Ry-
fuente
2
import pprint
pprint.pprint(mydic.keys())
Matt Joiner
fuente
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
fuente
1

Probablemente la forma más rápida de recuperar solo el nombre de la clave:

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

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

Resultado:

key_name

Convierte el dictionaryen un y listluego enumera el primer elemento que es el todo y dictluego enumera el primer valor de ese elemento que es:key_name

Fekete Sumér
fuente
¿Por qué recuperar el valor también?
Martijn Pieters
1

Busqué esta pregunta, porque quería saber cómo recuperar el nombre de "la clave" si mi diccionario solo tenía una entrada. En mi caso, la clave era desconocida para mí y podría ser cualquier cantidad de cosas. Esto es lo que se me ocurrió:

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
fuente
0

Prueba esto:

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
fuente
0
key_name = '...'
print "the key name is %s and its value is %s"%(key_name, mydic[key_name])
Don
fuente
0

Si desea obtener la clave de un valor único, lo siguiente sería útil:

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 manera pitónica:

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

Estoy agregando esta respuesta como una de las otras respuestas aquí ( https://stackoverflow.com/a/5905752/1904943 ) está fechada (Python 2; iteritems) y el código presentado, si está actualizado para Python 3 según lo sugerido solución alternativa en un comentario a esa respuesta: silenciosamente no puede devolver todos los datos relevantes.


Antecedentes

Tengo algunos datos metabólicos, representados en un gráfico (nodos, bordes, ...). En una representación de diccionario de esos datos, las claves son de la forma (604, 1037, 0)(que representan los nodos de origen y destino, y el tipo de borde), con valores de la forma5.3.1.9 (que representan los códigos de enzimas EC).

Encuentra claves para valores dados

El siguiente código encuentra correctamente mis claves, valores dados:

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)]

mientras que este código devuelve solo la primera (posiblemente de varias claves coincidentes):

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)

El último código, ingenuamente actualizado reemplazando iteritemscon items, no puede regresar (604, 3936, 0), (1037, 3936, 0.

Victoria Stuart
fuente
0

Para acceder a los datos, deberá hacer esto:

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

O, para acceder al valor, simplemente llámelo desde la clave: foo[bar]

mmendescortes
fuente