Replace a word in list and append to same list

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)) :





... why are you splitting item and using x in s.lower() for each part of item? Provided that elements in common_words do not contain a space you can simply do if any(x in item.lower() for x in common_words). In this case maybe using regexes is simpler... you just need to do a replaced = re.sub('|'.join(map(re.escape, common_words)), item, flags=re.I) if replaced != item: city.append(replaced).
– Giacomo Alzetta
Aug 22 at 7:33



item


x in s.lower()


item


common_words


if any(x in item.lower() for x in common_words)


replaced = re.sub('|'.join(map(re.escape, common_words)), item, flags=re.I) if replaced != item: city.append(replaced)




8 Answers
8



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



The list you have made contains incorrect spelling.

Look at list city's first element VenangoMuniciplaity and second element of common_words municipality


city


Venango


Municiplaity


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





@min2bro it replaces the words within the words as well, for example : Villageship to village. And it does not strip trailing whitespaces. And it is case-sensitive.
– Laurent H.
Aug 22 at 8:10






@LaurentH. Check the edit.
– Black Thunder
Aug 23 at 6:35



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


re.sub


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



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





it replace the words within the words as well, for example : Villageship to village
– min2bro
Aug 22 at 7:48





@min2bro then change if cw.lower() in c.lower(): to if cw.lower() in map(lambda x: x.lower(), c.split()): Take a look
– Ev. Kounis
Aug 22 at 7:53



if cw.lower() in c.lower():


if cw.lower() in map(lambda x: x.lower(), c.split()):





You're right ! I have updated my answer with if cw.lower() in c.lower().split() instead of if cw.lower() in c.lower(). Thanks a lot.
– Laurent H.
Aug 22 at 8:00



if cw.lower() in c.lower().split()


if cw.lower() in c.lower()



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





You should map(re.escape, common_words) to handle words containing "special characters".
– Giacomo Alzetta
Aug 22 at 7:36


map(re.escape, common_words)





if there is an item villageship, it re-inserts it, I just wanted to replace a word in the city.
– min2bro
Aug 22 at 7:51





part i.strip().split()[0] is what I am not a fan of.
– Ev. Kounis
Aug 22 at 7:52


i.strip().split()[0]



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


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)



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


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)



Output


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





fiddling with the initial list changes the problem a bit in this case. having municipality instead of municipality makes it considerably easier.
– Ev. Kounis
Aug 22 at 7:43


municipality


municipality



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






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)