2010-10-09 5 views
59

J'ai une liste Python de dictionnaires, comme suit:Vérifiez si la valeur existe déjà dans la liste des dictionnaires?

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é particulière/valeur existe déjà dans la liste, comme suit:

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

Répondre

131

est ici 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 retourne True pour chaque dictiona ry qui a la paire clé-valeur que vous recherchez, sinon False.


Si la clé pourrait également manquer le code ci-dessus peut vous donner un KeyError. Vous pouvez résoudre ce problème en utilisant get et en fournissant une valeur par défaut.

if not any(d.get('main_color', None) == 'red' for d in a): 
    # does not exist 
+1

Très agréable. Merci! – AP257

+0

Incroyable syntaxe one-liner, j'ai été si dur pour cela! Je suis curieux de savoir où dans les documents Python qui nous montre nous pouvons réellement mettre l'opération de 'pour' avant le 'pour'? – sylye

+1

Je l'ai trouvé, ça s'appelle List Comprehensions https://docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions – sylye

2

Peut-être une fonction dans ce sens est ce que vous êtes après:

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 
4

Peut-être que cette 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) 
Questions connexes