Initialisieren eines Wörterbuchs in Python mit einem Schlüsselwert und keinen entsprechenden Werten

76

Ich habe mich gefragt, ob es eine Möglichkeit gibt, ein Wörterbuch in Python mit Schlüsseln, aber ohne entsprechende Werte zu initialisieren, bis ich sie festgelegt habe. Sowie:

Definition = {'apple': , 'ball': }

und später kann ich sie einstellen:

Definition[key] = something

Ich möchte nur Schlüssel initialisieren, kenne aber die entsprechenden Werte erst, wenn ich sie später festlegen muss. Grundsätzlich weiß ich, mit welchen Schlüsseln ich die gefundenen Werte hinzufügen möchte. Vielen Dank.

user2989027
quelle
1
Warum möchten Sie Schlüssel initialisieren?
Seçkin Savaşçı
6
Es gibt keinen Schlüssel ohne Wert in einem Diktat. Sie können den Wert jedoch einfach auf Keine setzen.
BrenBarn
Was bedeutet es, einen Schlüssel ohne Wert zu definieren? Wenn Sie versuchen, auf dieses Element zuzugreifen, würde dies einen Fehler erzeugen (als hätten Sie diesen Schlüssel nie definiert) oder etwas ergeben (in diesem Fall ist etwas sein Wert)?
Scott Hunter
Da Sie wissen, dass Sie die Werte später ersetzen werden, spielt es keine Rolle, auf was Sie sie einstellen.
Mark Ransom
Ich habe ein Wörterbuch erstellt, das ein anderes Wörterbuch durchläuft, um nur die Werte der gewünschten Schlüssel zu erfassen. Daher wollte ich in der Lage sein, Schlüssel zu vergleichen und sie dann festzulegen, wenn sie gleich sind. Könnte ein schlechter Weg gewesen sein, aber es funktioniert! Danke noch einmal!
user2989027

Antworten:

63

Sie könnten sie auf initialisieren None.

Scott Hunter
quelle
4
Oder wenn None ein legitimer Wert für eines oder mehrere Ihrer Schlüsselwert-Tupel ist, können Sie etwas wie "SENTINEL = object ()" verwenden und SENTINEL als Sentinel-Wert verwenden und mit "is" anstelle von "==" testen.
Dstromberg
Ja, stimmte zu. Sehen Sie sich Ihren gesamten Datenumfang an und bestimmen Sie, welcher Wert niemals verfügbar sein sollte. -1, false, none, random int, random string und so weiter. Alte Frage, aber immer noch Top-Ergebnis.
Wütend 84
Die Verwendung Noneführt zu einem 'NoneType' object does not support item assignmentFehler ...
Markus
1
@ Markus: Ein solcher Fehler würde auftreten, wenn versucht wird, etwas zu tun, wie Definition[key] = somethingwann Definitionist None(was hier nicht befürwortet wird), nicht wann Definition[key]ist None(was ist).
Scott Hunter
91

Verwenden Sie die fromkeysFunktion, um ein Wörterbuch mit einem beliebigen Standardwert zu initialisieren. In Ihrem Fall werden Sie mit initialisieren, Noneda Sie keinen Standardwert im Auge haben.

empty_dict = dict.fromkeys(['apple','ball'])

Dies wird initialisiert empty_dictals:

empty_dict = {'apple': None, 'ball': None}

Wenn Sie das Wörterbuch mit einem anderen Standardwert als initialisieren möchten, können Sie alternativ Folgendes Nonetun:

default_value = 'xyz'
nonempty_dict = dict.fromkeys(['apple','ball'],default_value)
Codegeek
quelle
6
Stellen Sie bei Verwendung von dict.fromkeys (..., default_value) sicher, dass default_value nicht von einem Typ ist, für den ein Konstruktor (wie eine Liste) erforderlich ist. Andernfalls erhalten Sie in allen Buckets Verweise auf dasselbe Objekt.
Anton Teodor
10

Sie könnten ein Standarddiktat verwenden. Damit können Sie Wörterbuchwerte festlegen, ohne sich Sorgen machen zu müssen, ob der Schlüssel bereits vorhanden ist. Wenn Sie auf einen Schlüssel zugreifen, der noch nicht initialisiert wurde, wird ein von Ihnen angegebener Wert zurückgegeben (im folgenden Beispiel wird None zurückgegeben).

from collections import defaultdict
your_dict = defaultdict(lambda : None)
Hammer
quelle
8

Es wäre gut zu wissen, was Ihr Zweck ist, warum Sie die Schlüssel überhaupt initialisieren möchten. Ich bin mir nicht sicher, ob Sie das überhaupt tun müssen.

1) Wenn Sie die Anzahl der Vorkommen von Schlüsseln zählen möchten, können Sie einfach Folgendes tun:

Definition = {}
# ...
Definition[key] = Definition.get(key, 0) + 1

2) Wenn Sie später None (oder einen anderen Wert) für Schlüssel erhalten möchten, auf die Sie nicht gestoßen sind, können Sie erneut einfach die get () -Methode verwenden:

Definition.get(key)  # returns None if key not stored
Definition.get(key, default_other_than_none)

3) Für alle anderen Zwecke können Sie einfach eine Liste der erwarteten Schlüssel verwenden und prüfen, ob die später gefundenen Schlüssel mit diesen übereinstimmen.

Wenn Sie beispielsweise nur Werte für diese Schlüssel speichern möchten:

expected_keys = ['apple', 'banana']
# ...
if key_found in expected_keys:
    Definition[key_found] = value

Oder wenn Sie sicherstellen möchten, dass alle erwarteten Schlüssel gefunden wurden:

assert(all(key in Definition for key in expected_keys))

quelle
4

Sie können die Werte als leere Zeichenfolgen initialisieren und später ausfüllen, sobald sie gefunden werden.

dictionary = {'one':'','two':''}
dictionary['one']=1
dictionary['two']=2
Creggnog
quelle
2
q = input("Apple")
w = input("Ball")
Definition = {'apple': q, 'ball': w}
Aktufono
quelle
1

Verständnis könnte auch in diesem Fall bequem sein:

# from a list
keys = ["k1", "k2"]
d = {k:None for k in keys}

# or from another dict
d1 = {"k1" : 1, "k2" : 2}
d2 = {k:None for k in d1.keys()}

d2
# {'k1': None, 'k2': None}
Abiratsis
quelle
0

Basierend auf dem klarstellenden Kommentar von @ user2989027 denke ich, dass eine gute Lösung die folgende ist:

definition = ['apple', 'ball']
data = {'orange':1, 'pear':2, 'apple':3, 'ball':4}
my_data = {}
for k in definition:
  try:
    my_data[k]=data[k]
  except KeyError:
    pass
print my_data

Ich habe versucht, hier nichts Besonderes zu tun. Ich richte meine Daten und ein leeres Wörterbuch ein. Anschließend durchlaufe ich eine Liste von Zeichenfolgen, die potenzielle Schlüssel in meinem Datenwörterbuch darstellen. Ich kopiere jeden Wert von Daten nach my_data, betrachte aber den Fall, in dem Daten möglicherweise nicht den gewünschten Schlüssel haben.

Robert Lugg
quelle