Überprüfen Sie, ob der Wert in der Liste der Wörterbücher bereits vorhanden ist.

122

Ich habe eine Python-Liste mit Wörterbüchern wie folgt:

a = [
    {'main_color': 'red', 'second_color':'blue'},
    {'main_color': 'yellow', 'second_color':'green'},
    {'main_color': 'yellow', 'second_color':'blue'},
]

Ich möchte überprüfen, ob ein Wörterbuch mit einem bestimmten Schlüssel / Wert bereits in der Liste vorhanden ist:

// is a dict with 'main_color'='red' in the list already?
// if not: add item
AP257
quelle

Antworten:

268

Hier ist eine Möglichkeit, dies zu tun:

if not any(d['main_color'] == 'red' for d in a):
    # does not exist

Der Teil in Klammern ist ein Generatorausdruck, der Truefür jedes Wörterbuch zurückgegeben wird, das ansonsten das gesuchte Schlüssel-Wert-Paar enthält False.


Wenn der Schlüssel auch fehlen könnte, kann Ihnen der obige Code eine geben KeyError. Sie können dies beheben, getindem Sie einen Standardwert verwenden und angeben. Wenn Sie keinen Standardwert angeben, Nonewird dieser zurückgegeben.

if not any(d.get('main_color', default_value) == 'red' for d in a):
    # does not exist
Mark Byers
quelle
Erstaunliche Einzeilensyntax, ich habe so intensiv danach gesucht! Ich bin neugierig, dass wir in den Python-Dokumenten, die uns zeigen, die Operation 'für' tatsächlich vor die 'für' stellen können.
Sylye
1
Ich habe es gefunden, es heißt List Comprehensions docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions
Sylye
2
Gibt es eine Möglichkeit zu testen, ob 'main_color': 'red'UND 'second_color':'blue'existiert?
Florent
1
Gibt es eine Möglichkeit, nach Auswertung des Ausdrucks als wahr oder falsch eine Aktion für den Wert auszuführen, ohne erneut eine Schleife durchführen zu müssen?
Bryce
Es funktioniert nicht, wenn Daten mit "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}] geliefert werden
Ashok Sri
5

Vielleicht hilft das:

a = [{ 'main_color': 'red', 'second_color':'blue'},
     { 'main_color': 'yellow', 'second_color':'green'},
     { 'main_color': 'yellow', 'second_color':'blue'}]

def in_dictlist((key, value), my_dictlist):
    for this in my_dictlist:
        if this[key] == value:
            return this
    return {}

print in_dictlist(('main_color','red'), a)
print in_dictlist(('main_color','pink'), a)
Tony Veijalainen
quelle
3

Vielleicht ist eine Funktion in dieser Richtung das, wonach Sie suchen:

 def add_unique_to_dict_list(dict_list, key, value):
  for d in dict_list:
     if key in d:
        return d[key]

  dict_list.append({ key: value })
  return value
Cameron
quelle
1

Basierend auf der großartigen Antwort von @Mark Byers und der folgenden @ Florent-Frage, nur um anzuzeigen, dass es auch mit 2 Bedingungen auf der Liste der Dics mit mehr als 2 Schlüsseln funktioniert:

names = []
names.append({'first': 'Nil', 'last': 'Elliot', 'suffix': 'III'})
names.append({'first': 'Max', 'last': 'Sam', 'suffix': 'IX'})
names.append({'first': 'Anthony', 'last': 'Mark', 'suffix': 'IX'})

if not any(d['first'] == 'Anthony' and d['last'] == 'Mark' for d in names):

    print('Not exists!')
else:
    print('Exists!')

Ergebnis:

Exists!
Amitsas1
quelle