Wie drucke ich einen Wörterbuchschlüssel?

213

Ich möchte einen bestimmten Python-Wörterbuchschlüssel drucken:

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

Jetzt kann ich prüfen, ob mydic.has_key('key_name'), aber ich möchte den Namen des Schlüssels ausdrucken 'key_name'. Natürlich könnte ich verwenden mydic.items(), aber ich möchte nicht, dass alle Schlüssel aufgelistet werden, sondern nur ein bestimmter Schlüssel. Zum Beispiel würde ich so etwas erwarten (im Pseudocode):

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

Gibt es eine name_the_key()Methode zum Drucken eines Schlüsselnamens?


Edit: OK, vielen Dank für eure Reaktionen! :) Mir ist klar, dass meine Frage nicht gut formuliert und trivial ist. Ich war nur verwirrt, weil ich key_name erkannt habe und mydic['key_name']zwei verschiedene Dinge sind und ich dachte, es wäre falsch, das key_nameaus dem Wörterbuchkontext auszudrucken . Aber in der Tat kann ich einfach den 'Schlüsselnamen' verwenden, um auf den Schlüssel zu verweisen! :) :)

Benjamin
quelle
19
Wenn Sie wissen, was der gewünschte Schlüssel ist, ähm, wissen Sie bereits, was der Schlüssel ist.
Wooble

Antworten:

381

Ein Wörterbuch hat per Definition eine beliebige Anzahl von Schlüsseln. Es gibt keinen "Schlüssel". Sie haben die keys()Methode, mit der Sie eine Python listaller Schlüssel erhalten, und Sie haben die iteritems()Methode, die Schlüssel-Wert-Paare zurückgibt

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

Python 3-Version:

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

Sie haben also die Tasten im Griff, aber sie bedeuten nur dann wirklich Sinn, wenn sie an einen Wert gekoppelt sind. Ich hoffe ich habe deine Frage verstanden.

Juanchopanza
quelle
1
Obwohl dies in Python 2.7 für mich wunderbar funktioniert hat, was ist die Alternative in Py3k? Ich weiß, .iteritems()wird nicht mehr unterstützt ...
Piperchester
5
@PolyShell die Alternative in Python 3, wenn das das ist, was du mit Py3k meinst (ich bin jetzt schon eine Weile von Python weg) .items(). Ich habe ein Beispiel hinzugefügt.
Juanchopanza
1
@Bibhas Beide funktionieren, aber die Semantik ist unterschiedlich. items()Gibt eine Liste in Python 2.x zurück.
Juanchopanza
72

Zusätzlich können Sie ....

print(dictionary.items()) #prints keys and values
print(dictionary.keys()) #prints keys
print(dictionary.values()) #prints values
Mason
quelle
Vielen Dank! Genau das habe ich gesucht :)
Masoud Maleki
34

Hmm, ich denke, Sie möchten vielleicht alle Schlüssel im Wörterbuch und ihre jeweiligen Werte drucken ?

Wenn ja, möchten Sie Folgendes:

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

Stellen Sie sicher, dass Sie auch + anstelle von 'verwenden. Das Komma setzt jedes dieser Elemente in eine separate Zeile, wobei as plus sie in dieselbe Zeile setzt.

Dominic Santos
quelle
2
Das Komma belässt sie in derselben Zeile, fügt jedoch Leerzeichen zwischen "is"und keyusw. ein. Wenn Sie verwenden +, müssen Sie den zusätzlichen Abstand in die Zeichenfolgen einfügen . Auch Schlüssel und Wert sind nicht unbedingt Zeichenfolge. In diesem Fall werden durch Komma str (Schlüssel) und str (Wert) verwendet, während +ein Fehler verursacht wird
John La Rooy
1
Dies ist die einzige Antwort, von der ich weiß, dass sie nicht richtig ist, da das OP sagte: "Ich möchte nicht, dass alle Schlüssel aufgelistet werden."
Ned Batchelder
Aus irgendeinem Grund dachte ich anders für das Komma; Da hast du recht. Ich habe die Frage auch noch einmal gelesen, anscheinend haben wir beide 'alles' fett gedruckt - mein schlechtes.
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

Hinweis: In Python 3 wurde dic.iteritems () in dic.items () umbenannt.

ademar111190
quelle
25

Der Name des Schlüssels 'Schlüsselname' ist also Schlüsselname print 'key_name'oder eine beliebige Variable, die Sie darstellen.

Zenna
quelle
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))))
Fouad Boukredine
quelle
8

Da wir alle versuchen zu erraten, was "Drucken eines Schlüsselnamens" bedeuten könnte, werde ich es versuchen. Vielleicht möchten Sie eine Funktion, die einen Wert aus dem Wörterbuch übernimmt und den entsprechenden Schlüssel findet? Eine umgekehrte Suche?

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

Beachten Sie, dass viele Schlüssel denselben Wert haben können, sodass diese Funktion einige Schlüssel mit dem Wert zurückgibt, möglicherweise nicht den von Ihnen beabsichtigten.

Wenn Sie dies häufig tun müssen, ist es sinnvoll, das umgekehrte Wörterbuch zu erstellen:

d_rev = dict(v,k for k,v in d.iteritems())
Ned Batchelder
quelle
Beachten Sie (wie oben), dass Iteritems in Python 3 einfach zu "Elementen" wurden.
Mike
Achtung: Wenn Sie zu wechseln iteritems, itemsgibt diese Antwort, wie ursprünglich gezeigt, nur den ersten Schlüssel zurück - wenn mehrere Übereinstimmungen vorliegen. Um dies zu lösen, erstellen Sie eine leere Liste vor for loop( values_list = []) und hängen Sie die Schlüssel values_list.append(k)in der ifSchleife an diese Liste ( ) an . Verschieben Sie zuletzt die return-Anweisung ( return values_list) außerhalb der forSchleife.
Victoria Stuart
4

Oder Sie können es so machen:

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

Bearbeiten: Aktualisiert für die F-Strings von Python 3 ...

Brian Bruggeman
quelle
3

Stellen Sie sicher, dass Sie es tun

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

Was ist falsch daran, 'key_name'stattdessen zu verwenden, auch wenn es sich um eine Variable handelt?

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

Wahrscheinlich der schnellste Weg, um nur den Schlüsselnamen abzurufen:

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

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

Ergebnis:

key_name

Konvertiert das dictionaryin ein listdann listet es das erste Element auf, das das Ganze ist, dictdann listet es den ersten Wert dieses Elements auf, das ist:key_name

Fekete Sumér
quelle
Warum aber auch den Wert abrufen?
Martijn Pieters
1

Ich habe diese Frage nachgeschlagen, weil ich wissen wollte, wie ich den Namen "des Schlüssels" abrufen kann, wenn mein Wörterbuch nur einen Eintrag enthält. In meinem Fall war mir der Schlüssel unbekannt und konnte eine beliebige Anzahl von Dingen sein. Folgendes habe ich mir ausgedacht:

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

Versuche dies:

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

Wenn Sie den Schlüssel eines einzelnen Werts erhalten möchten, hilft Folgendes:

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

Auf pythonische Weise:

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

Ich füge diese Antwort hinzu, da eine der anderen Antworten hier ( https://stackoverflow.com/a/5905752/1904943 ) datiert ist (Python 2; iteritems) und der Code angezeigt wird - falls für Python 3 gemäß den vorgeschlagenen aktualisiert Problemumgehung in einem Kommentar zu dieser Antwort - Es werden stillschweigend nicht alle relevanten Daten zurückgegeben.


Hintergrund

Ich habe einige Stoffwechseldaten, die in einem Diagramm dargestellt sind (Knoten, Kanten, ...). In einer Wörterbuchdarstellung dieser Daten haben Schlüssel die Form (604, 1037, 0)(die Quell- und Zielknoten und den Kantentyp darstellt) mit Werten der Form 5.3.1.9(die EC-Enzymcodes darstellen).

Suchen Sie nach Schlüsseln für bestimmte Werte

Der folgende Code findet meine Schlüssel mit den angegebenen Werten korrekt:

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

Dieser Code gibt nur den ersten (von möglicherweise mehreren übereinstimmenden) Schlüssel zurück:

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)

Der letztere Code, der naiv aktualisiert und iteritemsdurch ersetzt wird items, kann nicht zurückgegeben werden (604, 3936, 0), (1037, 3936, 0.

Victoria Stuart
quelle
0

Um auf die Daten zuzugreifen, müssen Sie Folgendes tun:

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

Oder um auf den Wert zuzugreifen, rufen Sie ihn einfach über die Taste auf: foo[bar]

mmendescortes
quelle