Ma liste:
city=['Venango Municiplaity', 'Waterford ship','New York']
Résultat attendu:
city = ['Venango Municiplaity ', 'Waterford ship','New York','Venango','Waterford']
Mots communs:
common_words = ['ship','municipality']
Numérisez tous les éléments de Ma liste, supprimez les mots courants et ré-insérez-les dans la même liste, comme indiqué dans Résultat attendu.
Je suis en mesure de rechercher les éléments contenant les mots courants, mais je ne sais pas comment les remplacer par des blancs et les réinsérer dans Ma liste.
Mon code jusqu'ici:
for item in city:
if(any(x in s.lower() for s in item.split(' ') for x in common_words)) :
J'ai créé un petit code qui fonctionne comme prévu:
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)
Sortie:
['Venango Municiplaity', 'Waterford ship', 'New York', 'Waterford ']
La liste que vous avez faite contient une orthographe incorrecte.
Regardez le premier élément de la liste city
Venango
Municiplaity
et le deuxième élément de common_wordsmunicipality
Donc, si vous souhaitez également remplacer l'espace (s'il y en a un) derrière le mot, alors j'ai créé un code séparé:
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)
Sortie:
['Village home', 'Villagehome', 'New York', 'Village', 'Village']
Je vous suggère la solution suivante, en utilisant re.sub
avec flags=re.IGNORECASE
pour effacer les mots courants en ignorant le cas:
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']
Et voici la solution ONE-LINE STYLE utilisant la liste de compréhension, courte mais un peu moins lisible:
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']
Vous pouvez l'essayer, créer une nouvelle liste pour y sauvegarder des données. Ajouter les données à votre liste d'origine, puis concaténer le résultat:
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']
Ceci est une approche utilisant Regex.
Démo:
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)
Sortie:
['Venango Municiplaity', 'Waterford ship', 'New York', 'Venango', 'Waterford']
Vous pouvez utiliser un compréhension de liste afin de détecter si un élément contient quelque chose à ajouter à la liste 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)
Sortie
['Venango municipality', 'Waterford ship', 'New York', 'Venango', 'Waterford']
Placez les résultats dans une liste séparée puis utilisez list.extend()
pour ajouter le contenu de la liste de résultats à la liste d'origine
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)
Essayez ceci en utilisant extend
:
city.extend([i.split()[0] for i in city if i.split()[1].lower() in map(str.lower,common_words)])
Démo:
>>> 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']
>>>
Si mal orthographié:
>>> 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']
>>>
Une approche avec 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)
sortie:
['Venango Municipality', 'Waterford ship', 'New York', 'Venango', 'Waterford']