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

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

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)

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

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!
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.