Verifique se o valor já existe na lista de dicionários?

122

Eu tenho uma lista de dicionários Python, como segue:

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

Gostaria de verificar se já existe um dicionário com uma determinada chave / valor na lista, da seguinte maneira:

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

Respostas:

268

Esta é uma maneira de fazer isso:

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

A parte entre parênteses é uma expressão geradora que retorna Truepara cada dicionário que contém o par de valores-chave que você está procurando, caso contrário False.


Se a chave também estiver faltando, o código acima pode fornecer um KeyError. Você pode corrigir isso usando gete fornecendo um valor padrão. Se você não fornecer um valor padrão , Noneserá retornado.

if not any(d.get('main_color', default_value) == 'red' for d in a):
    # does not exist
Mark Byers
fonte
Sintaxe de uma linha incrível, eu tenho procurado tanto por isso! Estou curioso para saber que onde na documentação do Python que nos mostra podemos realmente colocar a operação de 'para' antes de 'para'?
sylye
1
Eu o encontrei, chama-se List Comprehensions docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions
sylye
2
Existe a possibilidade de testar se 'main_color': 'red'AND 'second_color':'blue'existe?
Florent
1
Existe uma maneira, uma vez que a expressão foi avaliada como verdadeira ou falsa, para executar uma ação no valor sem ter que repetir o loop?
Bryce
não está funcionando quando os dados vêm com "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}]
Ashok Sri
5

Talvez isso ajude:

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

Talvez uma função ao longo dessas linhas seja o que você procura:

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

Baseado na ótima resposta de @Mark Byers, e seguindo a pergunta de @Florent, apenas para indicar que também funcionará com 2 condições em lista de dados com mais de 2 chaves:

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
fonte