Sprawdź, czy wartość już istnieje na liście słowników?


122

Mam następującą listę słowników Pythona:

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

Chciałbym sprawdzić, czy słownik z określonym kluczem / wartością już istnieje na liście, w następujący sposób:

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

Odpowiedzi:


268

Oto jeden sposób, aby to zrobić:

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

Część w nawiasach to wyrażenie generatora, które zwraca Truedla każdego słownika, który ma szukaną parę klucz-wartość False. W przeciwnym razie .


Jeśli w kluczu może również brakować, powyższy kod może dać ci KeyError. Możesz to naprawić, używając geti podając wartość domyślną. Jeśli nie podasz wartości domyślnej , Nonezostanie zwrócony.

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

Niesamowita składnia jednowierszowa, szukałem tego tak mocno! Ciekaw jestem, że gdzie w dokumentach Pythona, które pokazują nam, możemy faktycznie umieścić operację „for” przed „for”?
sylye


2
Czy istnieje możliwość sprawdzenia, czy 'main_color': 'red'I 'second_color':'blue'istnieje?
Florent

1
Czy po ocenie wyrażenia jako prawda lub fałsz istnieje sposób wykonania akcji na wartości bez konieczności ponownego wykonywania pętli?
Bryce

nie działa, gdy dane pochodzą z "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}]
Ashok Sri

5

Może to pomoże:

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

Być może szukasz funkcji podobnej do tych:

 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

W oparciu o świetną odpowiedź @Mark Byers i po pytaniu @Florent, tylko po to, aby wskazać, że będzie działać również z 2 warunkami na liście dysków z więcej niż 2 kluczami:

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

Wynik:

Exists!
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.