Python удаляет словари из списка

#python #list #dictionary

#python #Список #словарь

Вопрос:

Python перечислил словари:

 _list_ = [{'key1': 'value1', 'key2': 'value2'}, {'key1': 'value3', 'key2': 'value4'}]

example_search_str1 = 'e1' # for value1 of key1

example_search_str2 = 'e3' # for value3 of key1
  

Я хочу удалить перечисленные словари, содержащие несколько примеров строк поиска. Как этого добиться? Существующие ответы не очень помогли. Новичок в Python здесь.

Комментарии:

1. Можете ли вы опубликовать свой код, в котором возникла ваша проблема?

2. Вы должны выбрать другое имя для своей переменной списка, потому list что это встроенная функция / класс: лучше не переопределять его.

3. Действительно, опечатка, я знаю, что список теней встроен в name. Редактирование сейчас.

4. Можете ли вы перефразировать свой вопрос? Я все еще не уверен, что именно вы хотите сделать. Каков ожидаемый результат, и пробовали ли вы?

5. Не могли бы вы уточнить свои сомнения?

Ответ №1:

Ваш вопрос немного неясен, но, насколько я понимаю, вы хотите удалить словари из списка, если их значение ‘key1’ является одним из некоторого количества строк.

 bad_strings = ['e1', 'e3']
new_list = [d for d in old_list if d['key1'] not in bad_strings] 
  

Редактировать:

О, я понял. Я был близок. Вы хотите посмотреть, содержит ли значение ‘key1’ запрещенные строки. также выполнимо.

 new_list = [d for d in old_list if not any(bad in d['key1'] for bad in bad_strings)]
  

Комментарии:

1. Точно. Итак, я должен работать с новым списком? Разве невозможно получить индексы и вместо этого использовать метод del?

2. В примере OP value1 это переменная, а не строка, хотя я подозреваю, что это опечатка…

3. Вы можете получить странное поведение при изменении итерации во время итерации по ней. Лучше этого не делать.

4. @brianpck считайте эти переменные строками, это не имеет значения. Вопрос тот же.

5. Это ничего не делает. Если вы установите old_list значение OP, ваш new_list var будет точно таким же, потому что ни одно из значений не находится в ‘e1’ или ‘e2’

Ответ №2:

Также для сопоставления (key, unwanted_value) Возможно, я бы попробовал что-то вроде:

 list_of_dicts =  [{'key1': 'value1', 'key2': 'value2'}, {'key1': 'value3', 'key2': 'value4'}]
bad_keys_vals = [('key1', 'value1'), ('key2', 'value2')]


def filter_dict_list(list_of_dicts, bad_keys_vals):
    return list(filter(lambda d: any((d[key] != bad_val for key, bad_val in bad_keys_vals)), list_of_dicts))

print(filter_dict_list(list_of_dicts, bad_keys_vals))
>> [{'key2': 'value4', 'key1': 'value3'}]
  

Но да, это приводит к созданию нового списка, поэтому вам, вероятно, потребуется перезаписать старый.