Replace a word in list and append to same list

My List:

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


Expected Result:

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


Common_words:

common_words = ['ship','municipality']


Scan all the items in My List and strip the common words and re-insert in the same list as shown in Expected Result.

I'm able to search the items which contains the common words but not sure how to replace that with blank and re-insert in My List.

My code so far:

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


I have made a small code that works as expected:

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)


Output:

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


Note:

The list you have made contains incorrect spelling.
Look at list city's first element VenangoMuniciplaity and second element of common_words municipality

Edit:

So if you also want to replace the space (if any) behind the word then I have made a separate code:

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)


Output:

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


I suggest you the following solution, using re.sub with flags=re.IGNORECASE to strip the common words ignoring the case:

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']


And here is the ONE-LINE STYLE solution using list comprehension, short but a bit less readable:

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']


You can try it, create new list to save there data should be added to your original list, and then concatenate result:

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']


This is one approach using Regex.

Demo:

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)


Output:

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


Put results in separate list and then use list.extend() to append contents of result list to original list

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)


You can use a list comprehension in order to detect if an item contains something to add to the city list.

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)


Output

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


Just for fun, here's a not robust or particular efficient method

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']


An approach with re module:

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)


output:

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

Comments

Popular posts from this blog

Meaning of `{}` for return expression

Get current scroll position of ScrollView in React Native

flutter websocket connection issue