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


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

Ответы:


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

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!
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.