it-swarm.com.de

Wie kann man überprüfen, ob ein Schlüssel-Wert-Paar in einem Wörterbuch vorhanden ist?

Gibt es eine intelligente Pythonic-Methode, um zu überprüfen, ob ein Element (Schlüssel, Wert) in einem Diktat enthalten ist?

a={'a':1,'b':2,'c':3}
b={'a':1}
c={'a':2}

b in a:
--> True
c in a:
--> False
10
Peter

Verwenden Sie die Kurzschlusseigenschaft von and. Wenn die linke Hand falsch ist, erhalten Sie auf diese Weise keine KeyError, während Sie nach dem Wert suchen.

>>> a={'a':1,'b':2,'c':3}
>>> key,value = 'c',3                # Key and value present
>>> key in a and value == a[key]
True
>>> key,value = 'b',3                # value absent
>>> key in a and value == a[key]
False
>>> key,value = 'z',3                # Key absent
>>> key in a and value == a[key]
False
13
Bhargav Rao

Sie haben diesen 2.7-Code im Gegensatz zu 2.x markiert, sodass Sie prüfen können, ob der Tuple in der viewitems des Diktats enthalten ist:

(key, value) in d.viewitems()

Unter der Haube tut dies im Grunde key in d and d[key] == value.

In Python 3 ist viewitems nur items, aber verwenden Sie items nicht in Python 2! Dadurch wird eine Liste erstellt und eine lineare Suche durchgeführt, wobei O(n) Zeit und Platz benötigt, um eine schnelle O(1) - Prüfung durchzuführen.

7
user2357112

Mein Kommentar in eine Antwort umwandeln: 

Verwenden Sie die dict.get -Methode, die bereits als eingebaute Methode bereitgestellt wird (und ich nehme an, dass dies die meisten Pythonic ist)

>>> dict = {'Name': 'Anakin', 'Age': 27}
>>> dict.get('Age')
27
>>> dict.get('Gender', 'None')
'None'
>>>

Wie in den Dokumenten -

get (Schlüssel, Standard) - 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 löst niemals einen KeyError aus.

3
letsc
>>> a = {'a': 1, 'b': 2, 'c': 3}
>>> b = {'a': 1}
>>> c = {'a': 2}

Zuerst ist hier ein Weg, der für Python2 und Python3 funktioniert

>>> all(k in a and a[k] == b[k] for k in b)
True
>>> all(k in a and a[k] == c[k] for k in c)
False

In Python3 können Sie auch verwenden

>>> b.items() <= a.items()
True
>>> c.items() <= a.items()
False

Für Python2 ist das Äquivalent

>>> b.viewitems() <= a.viewitems()
True
>>> c.viewitems() <= a.viewitems()
False
3
John La Rooy

Sie können einen Tupel des Schlüssels und den Wert des .items() des Wörterbuchs überprüfen.

test = {'a': 1, 'b': 2}
print(('a', 1) in test.items())
>>> True
1
Morgan Thrapp

Für Python 3.x Verwenden Sieif key in dict

Siehe den Beispielcode

#!/usr/bin/python
a={'a':1,'b':2,'c':3}
b={'a':1}
c={'a':2}
mylist = [a, b, c]
for obj in mylist:
    if 'b' in obj:
        print(obj['b'])


Output: 2
0
IRSHAD

Die Verwendung von .get ist normalerweise der beste Weg, um zu überprüfen, ob ein Schlüsselwertpaar vorhanden ist. 

if my_dict.get('some_key'):
  # Do something

Es gibt eine Einschränkung, wenn der Schlüssel existiert, aber falsch ist, wird der Test nicht bestanden, was möglicherweise nicht dem entspricht, was Sie wollen. Denken Sie daran, dass dies selten der Fall ist. Nun ist das Inverse ein häufigeres Problem. Das ist in, um das Vorhandensein eines Schlüssels zu testen. Ich habe dieses Problem häufig beim Lesen von CSV-Dateien gefunden.

Beispiel

# csv looks something like this:
a,b
1,1
1,

# now the code
import csv
with open('path/to/file', 'r') as fh:
  reader = csv.DictReader(fh) # reader is basically a list of dicts
  for row_d in reader:
    if 'b' in row_d:
      # On the second iteration of this loop, b maps to the empty string but
      # passes this condition statement, most of the time you won't want 
      # this. Using .get would be better for most things here. 
0
Dan

get verwenden:

# this doesn't work if `None` is a possible value
# but you can use a different sentinal value in that case
a.get('a') == 1

Versuch/außer:

# more verbose than using `get`, but more foolproof also
a = {'a':1,'b':2,'c':3}
try:
    has_item = a['a'] == 1
except KeyError:
    has_item = False

print(has_item)

Andere Antworten, die items in Python3 und viewitems in Python 2.7 vorschlagen, sind einfacher zu lesen und idiomatischer. Die Vorschläge in dieser Antwort funktionieren jedoch in beiden Python-Versionen ohne Kompatibilitätscode und laufen trotzdem in konstanter Zeit. Wähle dein Gift.

0
eestrada
   a.get('a') == 1
=> True
   a.get('a') == 2
=> False

wenn None ein gültiger Artikel ist:

{'x': None}.get('x', object()) is None
0
GingerPlusPlus