Заменить слово в списке и добавить в тот же список

Мой список:

city=['Venango Municiplaity', 'Waterford ship','New York']

Ожидаемый результат:

city = ['Venango Municiplaity ', 'Waterford ship','New York','Venango','Waterford']

Распространенные слова:

common_words = ['ship','municipality']

Сканируйте все элементы в Моем списке и разделите общие слова и снова вставьте их в тот же список, что и в ожидаемом результате.

Я могу искать элементы, содержащие общие слова, но не уверен, как заменить их пустым и повторно вставить в Мой список.

Мой код:

for item in city:
    if(any(x in s.lower() for s in item.split(' ') for x in common_words)) :

Ответы

Ответ 1

Я сделал небольшой код, который работает, как и ожидалось:

city=['Venango Municiplaity', 'Waterford ship','New York']
comwo = ['ship','municipality']
for i, c in enumerate(city):
    for ii in comwo:
        if ii in c:
            city.append(city[i].replace(ii,""))
print(city)

Выход:

['Venango Municiplaity', 'Waterford ship', 'New York', 'Waterford ']

Примечание:

Составленный вами список содержит неправильное написание.
Посмотрите на список city первый элемент VenangoMuniciplaity и второй элемент common_words municipality

Если вы хотите это в одну строку:

[city.append(city[i].replace(ii,"")) for ii in comwo for i, c in enumerate(city) if ii in c]

Я использовал понимание списка, чтобы добавить его в список city.


Изменить:

Поэтому, если вы также хотите заменить пробел (если есть) за словом, я сделал отдельный код:

city=['Village home', 'Villagehome','New York']
comwo = ['home']
for i, c in enumerate(city):
    for ii in comwo:
        if ii in c:
            city.append(city[i].replace(" "+ii,"")) if city[i].replace(" "+ii,"") != city[i] else city.append(city[i].replace(ii,""))
print(city)

Выход:

['Village home', 'Villagehome', 'New York', 'Village', 'Village']

Если вам это нужно в одной строке:

[city.append(city[i].replace(" "+ii,"")) if city[i].replace(" "+ii,"") != city[i] else city.append(city[i].replace(ii,"")) for ii in comwo for i, c in enumerate(city) if ii in c]

Ответ 2

Я предлагаю вам следующее решение, используя re.sub with flags=re.IGNORECASE чтобы flags=re.IGNORECASE общие слова, игнорируя случай:

import re

city = ['Venango Municipality', 'Waterford ship','New York']
common_words = ['ship','municipality']

toAppend = []

for c in city:
    for cw in common_words:
        if cw.lower() in c.lower().split():
            toAppend.append(re.sub(cw, "", c, flags=re.IGNORECASE).strip())

city += toAppend

print(city) # ['Venango Municipality', 'Waterford ship', 'New York', 'Venango', 'Waterford']

И вот решение ONE-LINE STYLE, использующее понимание списка, короткое, но немного менее читаемое:

import re

city = ['Venango Municipality', 'Waterford ship','New York']
common_words = ['ship','municipality']

city += [re.sub(cw, "", c, flags=re.IGNORECASE).strip() for c in city for cw in common_words if cw.lower() in c.lower().split()]

print(city) # ['Venango Municipality', 'Waterford ship', 'New York', 'Venango', 'Waterford']

Ответ 3

Вы можете попробовать, создать новый список, чтобы сохранить там данные должны быть добавлены в ваш первоначальный список, а затем соединить результат:

In [1]: city=['Venango Municiplaity', 'Waterford ship','New York']

In [2]: common_words = ['ship', 'municiplaity']

In [3]: list_add = []

In [4]: for item in city:
   ...:     item_words = [s.lower() for s in item.split(' ')]
   ...:     if set(common_words) & set(item_words):
   ...:         new_item = [s for s in item.split(' ') if s.lower() not in common_words]
   ...:         list_add.append(" ".join(new_item))
   ...:         

In [5]: city + list_add
Out[5]: ['Venango Municiplaity', 'Waterford ship', 'New York', 'Venango', 'Waterford']

Ответ 4

Это один подход с использованием Regex.

Демо - версия:

import re

city=['Venango Municiplaity', 'Waterford ship','New York']
common_words = ['ship','municiplaity']
common_words = "(" + "|".join(common_words) + ")"

res = []
for i in city:
    if re.search(common_words, i, flags=re.IGNORECASE):
        res.append(i.strip().split()[0])
print(city + res)

Выход:

['Venango Municiplaity', 'Waterford ship', 'New York', 'Venango', 'Waterford']

Ответ 5

Вы можете использовать понимание списка, чтобы определить, содержит ли элемент что-то, что нужно добавить в список city.

city=['Venango Municipality', 'Waterford ship','New York']

common_words = ['ship','municipality']
items_to_add = []
for item in city: 
  toAddition = [word for word in item.split() if word.lower() not in common_words]
  if ' '.join(toAddition) != item:
    items_to_add.append(' '.join(toAddition))

print(city + items_to_add)  

Выход

['Venango municipality', 'Waterford ship', 'New York', 'Venango', 'Waterford']

Ответ 6

Поместите результаты в отдельный список, а затем используйте list.extend() чтобы добавить содержимое списка результатов в исходный список

cities = ['Venango Municipality', 'Waterford ship', 'New York']

common_words = ['ship', 'municipality']

add_list = []

for city in cities:
    rl = []
    triggered = False
    for city_word in city.split():
        if city_word.lower() in common_words:
            triggered = True
        else:
            rl.append(city_word)
    if triggered:
        add_list.append(' '.join(rl))

cities.extend(add_list)
print(cities)

Ответ 7

Просто для удовольствия, здесь нет надежного или особо эффективного метода

city = ['Venango Municipality', 'Waterford ship', 'New York']
common_words = ['ship', 'Municipality']

city + [dict([_.split() for _ in city] + [list(reversed(_.split())) for _ in city]).get(_, '') for _ in common_words]
>>> ['Venango Municipality', 'Waterford ship', 'New York', 'Waterford', 'Venango']

Ответ 8

Подход с модулем re:

import re

city=['Venango Municipality', 'Waterford ship','New York']
common_words = ['ship','municipality']
print(city)

for item in city:
    word_list = str(item).split(" ")
    for word in word_list:
        if word.lower() in common_words:
            word_list.remove(word)
            city.extend(word_list)
            continue

print(city)

выход:

['Venango Municipality', 'Waterford ship', 'New York', 'Venango', 'Waterford']

Ответ 9

Попробуйте это, используя extend:

city.extend([i.split()[0] for i in city if i.split()[1].lower() in map(str.lower,common_words)])

Демо - версия:

>>> city=['Venango Municipality', 'Waterford ship','New York']
>>> common_words = ['ship','municipality']
>>> city.extend([i.split()[0] for i in city if i.split()[1].lower() in map(str.lower,common_words)])
>>> city
['Venango Municipality', 'Waterford ship', 'New York', 'Venango', 'Waterford']
>>> 

Если это означало ошибку:

>>> city=['Venango Municiplaity', 'Waterford ship','New York']
>>> common_words = ['ship','municipality']
>>> from difflib import SequenceMatcher
>>> city.extend([i.split()[0] for i in city if any(SequenceMatcher(None,i.split()[1].lower(),v).ratio()>0.8 for v in map(str.lower,common_words))])
>>> city
['Venango Municiplaity', 'Waterford ship', 'New York', 'Venango', 'Waterford']
>>>