Как удалить слова из списка значений в определенном ключе словаря?

Мне нужно удалить список слов из значений определенного ключа в моем списке словарей.

Вот пример того, как выглядят мои данные:

words = ['cloves', 'packed']

data = [{'title': 'Simple Enchiladas Verdes',
         'prep_time': '15 min',
         'cook_time': '30 min',
         'ingredients': ['chicken breast', 'tomato sauce', 'garlic cloves', 'fresh packed cilantro']
         'instructions': ['some text...'],
         'category': 'dessert',
         'cuisine': 'thai', 
         'article': ['some text...']
        },
        {...}, {...}]

Желаемый результат:

data = [{'title': 'Simple Enchiladas Verdes',
         'prep_time': '15 min',
         'cook_time': '30 min',
         'ingredients': ['chicken breast', 'tomato sauce', 'garlic', 'fresh cilantro']
        },
        {...}, {...}]

Пробовал разные коды:

remove = '|'.join(words)
regex = re.compile(r'\b('+remove+r')\b', flags=re.IGNORECASE)

for dct in data:
    dct['ingredients']= list(filter(lambda x: regex.sub('', x), dct['ingredients']))

Но это возвращает следующую ошибку: TypeError: sub() отсутствует 1 обязательный позиционный аргумент: 'string'

Другие коды, которые я пробовал:

for dct in data:
    dct['ingredients']= list(filter(lambda x: x != words, dct['ingredients']))
for dct in data:
    dct['ingredients']=[[el for el in string if el in words ] for string in dct['ingredients']]
for dct in data:
    for string in dct['ingredients']:
        dct['ingredients'] = list(filter(lambda x: x not in words, dct['ingredients']))

Но ни один из них не решает мою проблему.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
61
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Почему не list понимание с dictионарным пониманием:

data = [{k:([' '.join([s for s in x.split() if s not in words]) for x in v] if k == 'ingredients' else v) for k, v in i.items()} for i in data]

Но это заменит слова во всех моих ключах, а не только в ключе ['ингредиенты'], верно?

annag 22.05.2019 10:52

@annag Собственно, почему? это единственное, что можно заменить, так как перебор строк даст один символ, а значения списка больше

U12-Forward 22.05.2019 10:55

@ U9-Forward, потому что у меня есть другие ключи в словаре (здесь не отображаются). Я изменю пример данных.

annag 22.05.2019 11:02

@annag Отредактировал мой ответ, пожалуйста, примите его, если он работает :-)

U12-Forward 22.05.2019 11:05

@ U9-Forward код работает, но, к сожалению, ничего не меняет в моих данных

annag 22.05.2019 11:09

В вашем подходе re.sub вы должны использовать map, а не filter (вы не отфильтровываете отдельные слова, а заменяете всю строку результатом re.sub)

for dct in data:
    dct['ingredients']= list(map(lambda x: regex.sub('', x), dct['ingredients']))

Или, возможно, более читаемо, как понимание списка:

    dct['ingredients'] = [regex.sub("", x) for x in dct['ingredients']]

Однако оба оставят лишние пробелы. Если слова всегда разделяются пробелом, вы можете просто использовать split и join (быстрее, если words является set):

for dct in data:
    dct['ingredients'] = [' '.join(w for w in string.split() if w not in words)
                          for string in dct['ingredients']]
words = ['cloves', 'packed']

data = [{'title': 'Simple Enchiladas Verdes',
         'prep_time': '15 min',
         'cook_time': '30 min',
         'ingredients': ['chicken breast', 'tomato sauce', 'garlic cloves', 'fresh packed cilantro']}
        ]
for i in data:
    word = ' @! '.join(i['ingredients'])
    for k in words:
        word = word.replace(k,'').strip()

    i['ingredients']=[i.strip() for i in word.split('@!')]

выход

[{'title': 'Simple Enchiladas Verdes',
  'prep_time': '15 min',
  'cook_time': '30 min',
  'ingredients': ['chicken breast',
   'tomato sauce',
   'garlic',
   'fresh  cilantro']}]
words = ['cloves', 'packed']

data = [{'title': 'Simple Enchiladas Verdes',
         'prep_time': '15 min',
         'cook_time': '30 min',
         'ingredients': ['chicken breast', 'tomato sauce', 'garlic cloves', 'fresh packed cilantro']
        },
        {'title': 'Simple Enchiladas Verdes11',
         'prep_time': '15 min11',
         'cook_time': '30 min11',
         'ingredients': ['chicken breast1', '1tomato sauce', '1garlic cloves', '1fresh packed cilantro']}
        ]

n = []
for d in data:
    for item in d['ingredients']:
        for word in words:
            item = item.replace(word, '')
        n.append(item)
    d['ingredients'] = n

print (d)

выход:

{'title': 'Simple Enchiladas Verdes11', 'prep_time': '15 min11', 'cook_time': '30 min11', 'ingredients': ['chicken breast', 'tomato sauce', 'garlic ', 'fresh  cilantro', 'chicken breast1', '1tomato sauce', '1garlic ', '1fresh  cilantro']}

Другие вопросы по теме