Заменить слово в списке и добавить в тот же список
Мой список:
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
первый элемент Venango
Municiplaity
и второй элемент 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']
>>>