Compruebe si el valor ya existe en la lista de diccionarios.

122

Tengo una lista de diccionarios de Python, de la siguiente manera:

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

Me gustaría verificar si un diccionario con una clave / valor en particular ya existe en la lista, de la siguiente manera:

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

Respuestas:

268

He aquí una forma de hacerlo:

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

La parte entre paréntesis es una expresión generadora que devuelve Truepara cada diccionario que tiene el par clave-valor que está buscando, de lo contrario False.


Si la clave también puede faltar, el código anterior puede darle un KeyError. Puede solucionar este problema utilizando gety proporcionando un valor predeterminado. Si no proporciona un valor predeterminado , Nonese devuelve.

if not any(d.get('main_color', default_value) == 'red' for d in a):
    # does not exist
Mark Byers
fuente
Increíble sintaxis de una sola línea, ¡he estado buscando mucho para esto! Tengo curiosidad de saber en qué parte de los documentos de Python que nos muestran podemos poner la operación de 'para' antes de 'para'?
sylye
1
Lo encontré, se llama List Comprehensions docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions
sylye
2
¿Existe la posibilidad de probar si 'main_color': 'red'Y 'second_color':'blue'existe?
Florent
1
¿Hay alguna manera, una vez que la expresión se ha evaluado como verdadera o falsa, para realizar una acción sobre el valor sin tener que volver a realizar un bucle?
Bryce
no funciona cuando los datos vienen con "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}]
Ashok Sri
5

Quizás esto ayude:

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
fuente
3

Quizás una función en este sentido es lo que busca:

 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
fuente
1

Basado en la gran respuesta de @Mark Byers, y siguiendo la pregunta de @Florent, solo para indicar que también funcionará con 2 condiciones en la lista de dics con más de 2 teclas:

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

Resultado:

Exists!
Amitsas1
fuente