web-dev-qa-db-fra.com

Remplacer un mot dans la liste et l'ajouter à la même liste

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

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

Remarque:

La liste que vous avez faite contient une orthographe incorrecte.
Regardez le premier élément de la liste cityVenangoMuniciplaityet le deuxième élément de common_wordsmunicipality

Modifier:

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']
8
Black Thunder

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']
7
Laurent H.

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']
6
Bear Brown

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

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

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)
4
leotrubach

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']
>>> 
0
U9-Forward

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