Vérifier si la valeur existe déjà dans la liste des dictionnaires?

123

J'ai une liste de dictionnaires Python, comme suit:

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

Je voudrais vérifier si un dictionnaire avec une clé / valeur particulière existe déjà dans la liste, comme suit:

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

Réponses:

270

Voici une façon de le faire:

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

La partie entre parenthèses est une expression de générateur qui renvoie Truepour chaque dictionnaire contenant la paire clé-valeur que vous recherchez, sinon False.


Si la clé peut également manquer, le code ci-dessus peut vous donner un fichier KeyError. Vous pouvez résoudre ce problème en utilisant getet en fournissant une valeur par défaut. Si vous ne fournissez pas de valeur par défaut , Noneest renvoyé.

if not any(d.get('main_color', default_value) == 'red' for d in a):
    # does not exist
Mark Byers
la source
Incroyable syntaxe one-liner, j'ai tellement cherché ça! Je suis curieux de savoir où dans la documentation Python qui nous montre que nous pouvons réellement mettre l'opération de «pour» avant le «pour»?
sylye
1
Je l'ai trouvé, il s'appelle List Comprehensions docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions
sylye
2
Existe-t-il une possibilité de tester si 'main_color': 'red'ET 'second_color':'blue'existe?
Florent
1
Existe-t-il un moyen, une fois que l'expression a évalué vrai ou faux, d'effectuer une action sur la valeur sans avoir à recommencer?
Bryce
cela ne fonctionne pas lorsque les données sont accompagnées de "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}]
Ashok Sri
5

Peut-être que cela aide:

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
la source
3

Peut-être que vous recherchez une fonction de ce genre:

 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
la source
1

Basé sur l'excellente réponse de @Mark Byers, et suite à la question @Florent, juste pour indiquer qu'il fonctionnera également avec 2 conditions sur la liste de dics avec plus de 2 clés:

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!')

Résultat:

Exists!
Amitsas1
la source