#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'}]
Но да, это приводит к созданию нового списка, поэтому вам, вероятно, потребуется перезаписать старый.