it-swarm.com.de

Warum dict.get (key) anstelle von dict [key]?

Heute stieß ich auf die dict-Methode get, die bei Angabe eines Schlüssels im Wörterbuch den zugehörigen Wert zurückgibt.

Zu welchem ​​Zweck ist diese Funktion nützlich? Wenn ich einen mit einem Schlüssel verknüpften Wert in einem Wörterbuch suchen wollte, kann ich einfach dict[key] ausführen, und es wird dasselbe zurückgegeben:

dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
443
stensootla

Sie können einen Standardwert angeben, wenn der Schlüssel fehlt:

dictionary.get("bogus", default_value)

gibt default_value zurück (was auch immer Sie wählen), während

dictionary["bogus"]

würde eine KeyError erhöhen. 

Wenn weggelassen, ist default_valueNone, so dass

dictionary.get("bogus")  # <-- No default specified -- defaults to None

gibt None genauso zurück 

dictionary.get("bogus", None)

würde. 

735
unutbu

Was ist die dict.get()-Methode?

Wie bereits erwähnt, enthält die get-Methode einen zusätzlichen Parameter, der den fehlenden Wert angibt. Aus der Dokumentation

get(key[, default])

Gibt den Wert für key zurück, wenn key im Wörterbuch vorhanden ist, andernfalls default. Wenn default nicht angegeben ist, wird der Standardwert None verwendet, sodass diese Methode niemals eine KeyError auslöst.

Ein Beispiel kann sein 

>>> d = {1:2,2:3}
>>> d[1]
2
>>> d.get(1)
2
>>> d.get(3)
>>> repr(d.get(3))
'None'
>>> d.get(3,1)
1

Gibt es irgendwo Geschwindigkeitsverbesserungen?

Wie erwähnt hier ,

Es scheint, dass alle drei Ansätze nun eine ähnliche Leistung zeigen (innerhalb von etwa 10%), mehr oder weniger unabhängig von den Eigenschaften der Wortliste.

Früher war get erheblich langsamer, jedoch ist die Geschwindigkeit jetzt fast vergleichbar mit dem zusätzlichen Vorteil der Rückgabe des Standardwerts. Um jedoch alle unsere Abfragen zu löschen, können wir eine relativ große Liste testen (Beachten Sie, dass der Test nur das Nachschlagen aller gültigen Schlüssel beinhaltet)

def getway(d):
    for i in range(100):
        s = d.get(i)

def lookup(d):
    for i in range(100):
        s = d[i]

Timing diese beiden Funktionen nun mit timeit

>>> import timeit
>>> print(timeit.timeit("getway({i:i for i in range(100)})","from __main__ import getway"))
20.2124660015
>>> print(timeit.timeit("lookup({i:i for i in range(100)})","from __main__ import lookup"))
16.16223979

Wie wir sehen können, ist die Suche schneller als die Abfrage, da keine Funktionssuche erfolgt. Dies kann durch dis gesehen werden

>>> def lookup(d,val):
...     return d[val]
... 
>>> def getway(d,val):
...     return d.get(val)
... 
>>> dis.dis(getway)
  2           0 LOAD_FAST                0 (d)
              3 LOAD_ATTR                0 (get)
              6 LOAD_FAST                1 (val)
              9 CALL_FUNCTION            1
             12 RETURN_VALUE        
>>> dis.dis(lookup)
  2           0 LOAD_FAST                0 (d)
              3 LOAD_FAST                1 (val)
              6 BINARY_SUBSCR       
              7 RETURN_VALUE  

Wo wird es nützlich sein?

Dies ist immer dann hilfreich, wenn Sie beim Nachschlagen eines Wörterbuchs einen Standardwert angeben möchten. Dies reduziert

 if key in dic:
      val = key[dic]
 else:
      val = def_val

Zu einer einzelnen Zeile, val = dic.get(key,def_val)

Wo ist es NICHT nützlich?

Wann immer Sie eine KeyError zurückgeben möchten, die besagt, dass der betreffende Schlüssel nicht verfügbar ist. Die Rückgabe eines Standardwerts birgt auch das Risiko, dass ein bestimmter Standardwert auch ein Schlüssel ist! 

Ist es möglich, get ähnliche Funktion in dict['key'] zu haben?

Ja! Wir müssen den __missing__ in einer Dict-Unterklasse implementieren.

Ein Beispielprogramm kann sein

class MyDict(dict):
    def __missing__(self, key):
        return None

Eine kleine Demonstration kann sein

>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
93
Bhargav Rao

get nimmt einen zweiten optionalen Wert. Wenn der angegebene Schlüssel nicht in Ihrem Wörterbuch vorhanden ist, wird dieser Wert zurückgegeben.

dictionary = {"Name": "Harry", "Age": 17}
dictionary.get('Year', 'No available data')
>> 'No available data'

Wenn Sie den zweiten Parameter nicht angeben, wird None zurückgegeben.

Wenn Sie die Indexierung wie in dictionary['Year'] verwenden, erhöhen nicht vorhandene Schlüssel KeyError.

26
FallenAngel

Ich werde ein praktisches Beispiel für das Scraping von Webdaten mit Python geben. Oft erhalten Sie Schlüssel ohne Werte. In diesem Fall erhalten Sie Fehler, wenn Sie dictionary ['key'] verwenden, wohingegen dictionary.get ('key ',' return_otherwise ') hat keine Probleme.

Ebenso würde ich '' .join (Liste) anstelle von Liste [0] verwenden, wenn Sie versuchen, einen einzelnen Wert aus einer Liste zu erfassen.

ich hoffe es hilft.

[Bearbeiten] Hier ist ein praktisches Beispiel:

Angenommen, Sie rufen eine API auf, die eine JOSN-Datei zurückgibt, die Sie analysieren müssen. Die erste JSON sieht folgendermaßen aus:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","submitdate_ts":1318794805,"users_id":"2674360","project_id":"1250499"}}

Die zweite JOSN ist wie folgt:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","users_id":"2674360","project_id":"1250499"}}

Beachten Sie, dass in der zweiten JSON der Schlüssel "submitdate_ts" fehlt, was in jeder Datenstruktur normal ist.

Wenn Sie also versuchen, auf den Wert dieser Taste in einer Schleife zuzugreifen, können Sie ihn mit folgendem Befehl aufrufen:

for item in API_call:
    submitdate_ts = item["bids"]["submitdate_ts"]

Sie könnten es, aber es gibt einen Traceback-Fehler für die zweite JSON-Zeile, da der Schlüssel einfach nicht existiert.

Die geeignete Art, dies zu codieren, könnte folgende sein:

for item in API_call:
    submitdate_ts = item.get("bids", {'x': None}).get("submitdate_ts")

{'x': None} soll verhindern, dass die zweite Ebene einen Fehler erhält. Natürlich können Sie beim Scraping mehr Fehlertoleranz in den Code einbauen. Wie bei der ersten Angabe einer if-Bedingung

18
kevin

Der Zweck ist, dass Sie einen Standardwert angeben können, wenn der Schlüssel nicht gefunden wird. Dies ist sehr nützlich

dictionary.get("Name",'harry')
14
hackartist

Zu welchem ​​Zweck ist diese Funktion nützlich?

Eine besondere Verwendung ist das Zählen mit dem Wörterbuch. Angenommen, Sie möchten eine Anzahl von Vorkommen jedes Elements in einer bestimmten Liste zählen. Der übliche Weg ist, ein Wörterbuch zu erstellen, in dem Schlüssel Elemente und Werte die Anzahl der Vorkommen sind.

fruits = ['Apple', 'banana', 'Peach', 'Apple', 'pear']
d = {}
for fruit in fruits:
    if fruit not in d:
        d[fruit] = 0
    d[fruit] += 1

Mit der .get () -Methode können Sie diesen Code kompakter und klarer gestalten:

for fruit in fruits:
      d[fruit] = d.get(fruit, 0) + 1
2
jetpack_guy
  • dict.get gibt standardmäßig keinen Wert zurück, wenn der Schlüssel nicht vorhanden ist. Wenn Sie jedoch das zweite Argument angeben, wird dies zurückgegeben, wenn der Schlüssel nicht vorhanden ist.

  • OTOH dict[key] erhöht KeyError, wenn der Schlüssel nicht vorhanden ist.

Hier ist ein Beispiel (Kommentare lesen):

>>> d={'a':[1,2,3],'b':[4,5,6]} # Create a dictionary
>>> d['c'] # Hoops, error key does not exist
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    d['c']
KeyError: 'c'
>>> d.get('c') # no error because of `get`, so nothing returned
>>> print(d.get('c')) # i print it, oh `None` is the output
None
>>> d.get('c',100) # Okay now i set second argument's value to `100`, hoopa output is `100`
100
>>> d['a'] # Works, key exist
[1, 2, 3]
>>> d.get('a') # work too, key exist
[1, 2, 3]
0
U9-Forward

Ein wichtiger Punkt bei der Verwendung von .get ():

Wenn das Wörterbuch den im Aufruf von .get() verwendeten Schlüssel enthält und dessen Wert None ist, gibt .get()None zurück, auch wenn ein zweiter Wert angegeben wird.

Das folgende Beispiel gibt None zurück und nicht wie erwartet 'alt_value':

d = {'key': None}
d.get('key', 'alt_value')

Der zweite Wert von .get() wird nur zurückgegeben, wenn der angegebene Schlüssel NICHT im Wörterbuch enthalten ist, nicht, wenn der Rückgabewert dieses Aufrufs None ist.

0
Colton Hicks

Basierend auf der Verwendung sollte diese get-Methode verwendet werden.

Beispiel 1

In [14]: user_dict = {'type': False}

In [15]: user_dict.get('type', '')

Out[15]: False

In [16]: user_dict.get('type') or ''

Out[16]: ''

Beispiel2

In [17]: user_dict = {'type': "lead"}

In [18]: user_dict.get('type') or ''

Out[18]: 'lead'

In [19]: user_dict.get('type', '')

Out[19]: 'lead'
0
Muthuvel

Warum dict.get (key) anstelle von dict [key]?

0. Zusammenfassung

Im Vergleich zu dict[key] liefert dict.get einen Fallback-Wert, wenn nach einem Schlüssel gesucht wird.

1. Definition

get (key [ default]) 4. Eingebaute Typen - Python 3.6.4rc1-Dokumentation

Gibt den Wert für key zurück, wenn key im Wörterbuch vorhanden ist, andernfalls default. Wenn default nicht angegeben ist, wird der Standardwert None verwendet, sodass diese Methode niemals einen KeyError auslöst.

d = {"Name": "Harry", "Age": 17}
In [4]: d['gender']
KeyError: 'gender'
In [5]: d.get('gender', 'Not specified, please add it')
Out[5]: 'Not specified, please add it'

2. Problem löst es.

Ohne default value müssen Sie schwerfällige Codes schreiben, um eine solche Ausnahme zu behandeln.

def get_harry_info(key):
    try:
        return "{}".format(d[key])
    except KeyError:
        return 'Not specified, please add it'
In [9]: get_harry_info('Name')
Out[9]: 'Harry'
In [10]: get_harry_info('Gender')
Out[10]: 'Not specified, please add it'

Als praktische Lösung führt dict.get einen optionalen Standardwert ein, der unerwünschte Codes verhindert.

3. Schlussfolgerung

dict.get verfügt über eine zusätzliche Standardwertoption, mit der eine Ausnahme behandelt werden kann, wenn der Schlüssel im Wörterbuch nicht vorhanden ist

0
JawSaw