Verificare se il valore esiste già nell'elenco dei dizionari?


122

Ho un elenco di dizionari Python, come segue:

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

Vorrei controllare se un dizionario con una particolare chiave / valore esiste già nell'elenco, come segue:

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

Risposte:


268

Ecco un modo per farlo:

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

La parte tra parentesi è un'espressione generatrice che restituisce Trueper ogni dizionario che ha la coppia chiave-valore che stai cercando, altrimenti False.


Se la chiave potrebbe anche mancare, il codice sopra può darti un KeyError. Puoi risolvere questo problema utilizzando gete fornendo un valore predefinito. Se non fornisci un valore predefinito , Noneviene restituito.

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

Incredibile sintassi di una riga, ho cercato così tanto per questo! Sono curioso di sapere dove nella documentazione di Python che ci mostra possiamo effettivamente mettere l'operazione di "for" prima di "for"?
Sylye

1
L'ho trovato, si chiama List Comprehensions docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions
sylye

2
C'è la possibilità di verificare se esiste 'main_color': 'red'AND 'second_color':'blue'?
Florent

1
Esiste un modo, una volta che l'espressione è stata valutata come vera o falsa, per eseguire un'azione sul valore senza dover ripetere il ciclo?
Bryce

non funziona quando i dati vengono forniti con "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}]
Ashok Sri

5

Forse questo aiuta:

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)

3

Forse una funzione in questo senso è ciò che stai cercando:

 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

1

Basato sull'ottima risposta di @Mark Byers e sulla domanda di @Florent, solo per indicare che funzionerà anche con 2 condizioni nell'elenco di dics con più di 2 chiavi:

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

Risultato:

Exists!
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.