Перевірте, чи значення вже існує у списку словників?


122

У мене є список словників 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

Відповіді:


268

Ось один із способів зробити це:

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
Я знайшов це, це називається Список Зрозуміння docs.python.org/2/whatsnew/2.0.html?highlight=comnance
sylye

2
Є можливість перевірити , якщо 'main_color': 'red'І 'second_color':'blue'існує?
Флорент

1
Чи існує спосіб, як тільки вираз буде оцінено як істинне чи хибне, виконати дію на значення, не потребуючи повторного циклу?
Брайс

його не працює, коли дані надходять з "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}]
Ashok Sri

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 клавішами:

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.