Проверить, существует ли значение в списке словарей?

123

У меня есть список словарей Python, а именно:

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

Я хотел бы проверить, существует ли уже в списке словарь с определенным ключом / значением, а именно:

// is a dict with 'main_color'='red' in the list already?
// if not: add item
AP257
источник

Ответы:

269

Вот один из способов сделать это:

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

Часть в круглых скобках - это выражение генератора, которое возвращается Trueдля каждого словаря, имеющего искомую пару ключ-значение False.


Если ключ также может отсутствовать, приведенный выше код может дать вам расширение KeyError. Вы можете исправить это, используя getи указав значение по умолчанию. Если вы не укажете значение по умолчанию , Noneвозвращается.

if not any(d.get('main_color', default_value) == 'red' for d in a):
    # does not exist
Марк Байерс
источник
Удивительный однострочный синтаксис, я так старался его найти! Мне любопытно, где в документации Python, которая показывает нам, мы можем фактически поместить операцию «for» перед «for»?
sylye
1
Я нашел это, это называется List Compression docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions
sylye
2
Есть ли возможность проверить, существует ли 'main_color': 'red'И 'second_color':'blue'?
Флоран
1
Есть ли способ, как только выражение оценивается как истинное или ложное, выполнить действие над значением без повторного цикла?
Bryce
он не работает, когда данные идут с "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}]
Ашок Шри
5

Может, это поможет:

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

Возможно, вам нужна функция подобного рода:

 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
источник
1

Основываясь на отличном ответе @Mark Byers и следующем вопросе @Florent, просто чтобы указать, что он также будет работать с 2 условиями в списке dics с более чем 2 ключами:

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

Результат:

Exists!
Amitsas1
источник