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)) :
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 Venango
Municiplaity
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.
... why are you splitting
item
and usingx in s.lower()
for each part ofitem
? Provided that elements incommon_words
do not contain a space you can simply doif any(x in item.lower() for x in common_words)
. In this case maybe using regexes is simpler... you just need to do areplaced = 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