Come stampare la chiave di un dizionario?


213

Vorrei stampare una chiave specifica del dizionario Python:

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

Ora posso verificare se mydic.has_key('key_name'), ma ciò che vorrei fare è stampare il nome della chiave 'key_name'. Ovviamente potrei usare mydic.items(), ma non voglio elencare tutte le chiavi, ma solo una chiave specifica. Ad esempio, mi aspetto qualcosa del genere (in pseudo-codice):

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

Esiste un name_the_key()metodo per stampare un nome chiave?


Modifica: OK, grazie mille ragazzi per le vostre reazioni! :) Mi rendo conto che la mia domanda non è ben formulata e banale. Mi sono appena confuso perché ho realizzato key_name e mydic['key_name']sono due cose diverse e ho pensato che sarebbe stato sbagliato stampare il key_namecontesto fuori dal dizionario. Ma in effetti posso semplicemente usare "key_name" per fare riferimento alla chiave! :)


19
Se sai qual è la chiave specifica che vuoi, umm, sai già qual è la chiave.
Wooble,

Risposte:


382

Un dizionario ha, per definizione, un numero arbitrario di chiavi. Non esiste "la chiave". Hai il keys()metodo, che ti dà un pitone listdi tutte le chiavi, e hai il iteritems()metodo, che restituisce coppie chiave-valore, quindi

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

Versione Python 3:

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

Quindi hai una maniglia sui tasti, ma significano davvero senso solo se abbinati a un valore. Spero di aver capito la tua domanda.


1
Anche se questo ha funzionato magnificamente per me in Python 2.7, qual è l'alternativa in Py3k? So che .iteritems()non è più supportato ...
piperchester,

5
@PolyShell l'alternativa in Python 3, se questo è ciò che intendi per Py3k (sono stato lontano da Python per un po 'di tempo ora) .items(). Ho aggiunto un esempio.
juanchopanza,

1
@Bibhas Entrambi funzionano, ma la semantica è diversa. items()restituisce un elenco in Python 2.x.
juanchopanza,

73

Inoltre puoi usare ....

print(dictionary.items()) #prints keys and values
print(dictionary.keys()) #prints keys
print(dictionary.values()) #prints values

Grazie! Questo è quello che stavo esattamente cercando :)
Masoud Maleki

34

Hmm, penso che ciò che potresti voler fare è stampare tutte le chiavi del dizionario e i loro rispettivi valori?

In tal caso, si desidera quanto segue:

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

Assicurati di usare anche + 's invece di'. La virgola metterà ciascuno di quegli elementi su una riga separata penso, dove come più li metterà sulla stessa riga.


2
la virgola li lascerà sulla stessa riga, ma inserirà degli spazi tra "is"e keyecc. Se si utilizza +è necessario inserire il riempimento extra nelle stringhe. Anche chiave e valore non sono necessariamente stringa, nel qual caso la virgola utilizzerà str (chiave) e str (valore) mentre +causerà un errore
John La Rooy,

1
Questa è l'unica risposta che so non è corretta, poiché l'OP ha detto: "Non voglio che siano elencate tutte le chiavi".
Ned Batchelder,

Per qualche ragione ho pensato diversamente per la virgola; hai ragione su quello. Ho anche riletto la domanda, sembra che abbiamo messo entrambi in grassetto - il mio male.
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: in Python 3, dic.iteritems () è stato rinominato come dic.items ()


25

Il nome della chiave 'key_name' è key_name, quindi print 'key_name'o qualunque variabile tu lo rappresenti.


10

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

8

Dal momento che stiamo tutti cercando di indovinare cosa significhi "stampare un nome chiave", ci penserò io. Forse vuoi una funzione che prende un valore dal dizionario e trova la chiave corrispondente? Una ricerca 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

Si noti che molte chiavi potrebbero avere lo stesso valore, quindi questa funzione restituirà alcune chiavi con il valore, forse non quello desiderato.

Se è necessario farlo frequentemente, sarebbe opportuno costruire il dizionario inverso:

d_rev = dict(v,k for k,v in d.iteritems())

Nota (come sopra) che gli iteritems sono diventati semplicemente "oggetti" in Python 3.
Mike

Attenzione: se si iteritemspassa a items, come mostrato inizialmente questa risposta restituirà solo la prima chiave - se ci sono più corrispondenze. Per risolvere questo problema, crea un elenco vuoto prima di for loop( values_list = []), quindi aggiungi le chiavi a questo elenco ( values_list.append(k)), nel ifciclo. Infine, sposta l'istruzione return ( return values_list) all'esterno del forciclo.
Victoria Stuart,


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

Modifica: aggiornato per le f-string di Python 3 ...


3

Assicurati di fare

dictionary.keys()
# rather than
dictionary.keys

2

Cosa c'è che non va nell'utilizzo 'key_name', anche se è una variabile?



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)

1

Probabilmente il modo più veloce per recuperare solo il nome della chiave:

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

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

Risultato:

key_name

Converte dictionaryin a listquindi elenca il primo elemento che è l'intero, dictquindi elenca il primo valore di quell'elemento che è:key_name


Perché recuperare anche questo valore?
Martijn Pieters

1

Ho cercato questa domanda, perché volevo sapere come recuperare il nome della "chiave" se il mio dizionario avesse una sola voce. Nel mio caso, la chiave non mi era nota e poteva essere qualsiasi numero di cose. Ecco cosa mi è venuto in mente:

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

0

Prova questo:

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

0
key_name = '...'
print "the key name is %s and its value is %s"%(key_name, mydic[key_name])

0

Se si desidera ottenere la chiave di un singolo valore, sarebbe utile quanto segue:

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

In modo pitonico:

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

0

Sto aggiungendo questa risposta come una delle altre risposte qui ( https://stackoverflow.com/a/5905752/1904943 ) è datata (Python 2; iteritems), e il codice presentato - se aggiornato per Python 3 secondo il suggerito soluzione alternativa in un commento a quella risposta - non riesce a restituire silenziosamente tutti i dati rilevanti.


sfondo

Ho alcuni dati metabolici, rappresentati in un grafico (nodi, bordi, ...). In una rappresentazione del dizionario di tali dati, le chiavi sono del modulo (604, 1037, 0)(che rappresentano i nodi di origine e di destinazione e il tipo di bordo), con i valori del modulo5.3.1.9 (che rappresentano i codici degli enzimi CE).

Trova le chiavi per determinati valori

Il seguente codice trova correttamente le mie chiavi, dati i valori:

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

mentre questo codice restituisce solo le prime (possibilmente diverse corrispondenze) chiavi:

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)

Quest'ultimo codice, sostituito ingenuamente in sostituzione iteritemscon items, non riesce a restituire (604, 3936, 0), (1037, 3936, 0.


0

Per accedere ai dati, devi fare questo:

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

Oppure, per accedere al valore è sufficiente chiamarlo dal tasto: foo[bar]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.