Exemple suivant:
string1 = "calvin klein design dress calvin klein"
Comment puis-je supprimer les deux autres doublons "calvin"
et "klein"
?
Le résultat devrait ressembler à
string2 = "calvin klein design dress"
seuls les seconds doublons doivent être supprimés et l'ordre des mots ne doit pas être modifié!
def unique_list(l):
ulist = []
[ulist.append(x) for x in l if x not in ulist]
return ulist
a="calvin klein design dress calvin klein"
a=' '.join(unique_list(a.split()))
string1 = "calvin klein design dress calvin klein"
words = string1.split()
print (" ".join(sorted(set(words), key=words.index)))
Cela trie l'ensemble de tous les mots (uniques) de votre chaîne en fonction de l'index de Word dans la liste de mots d'origine.
Dans Python 2.7+, vous pouvez utiliser collections.OrderedDict
pour ceci:
from collections import OrderedDict
s = "calvin klein design dress calvin klein"
print ' '.join(OrderedDict((w,w) for w in s.split()).keys())
Couper et coller à partir des recettes d'itertools
from itertools import ifilterfalse
def unique_everseen(iterable, key=None):
"List unique elements, preserving order. Remember all elements ever seen."
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
# unique_everseen('ABBCcAD', str.lower) --> A B C D
seen = set()
seen_add = seen.add
if key is None:
for element in ifilterfalse(seen.__contains__, iterable):
seen_add(element)
yield element
else:
for element in iterable:
k = key(element)
if k not in seen:
seen_add(k)
yield element
Je souhaite vraiment qu'ils puissent aller de l'avant et faire un module de ces recettes bientôt. J'aimerais beaucoup pouvoir faire from itertools_recipes import unique_everseen
au lieu d'utiliser couper-coller à chaque fois que j'ai besoin de quelque chose.
Utilisez comme ceci:
def unique_words(string, ignore_case=False):
key = None
if ignore_case:
key = str.lower
return " ".join(unique_everseen(string.split(), key=key))
string2 = unique_words(string1)
string = 'calvin klein design dress calvin klein'
def uniquify(string):
output = []
seen = set()
for Word in string.split():
if Word not in seen:
output.append(Word)
seen.add(Word)
return ' '.join(output)
print uniquify(string)
Vous pouvez utiliser un ensemble pour suivre les mots déjà traités.
words = set()
result = ''
for Word in string1.split():
if Word not in words:
result = result + Word + ' '
words.add(Word)
print result
Vous pouvez le faire simplement en obtenant l'ensemble associé à la chaîne, qui est un objet mathématique ne contenant aucun élément répété par définition. Il suffit de joindre les mots de l'ensemble dans une chaîne:
def remove_duplicate_words(string):
return ' '.join(set(string.split()))
Question: Supprimer les doublons dans une chaîne
from _collections import OrderedDict
a = "Gina Gini Gini Protijayi"
aa = OrderedDict().fromkeys(a.split())
print(' '.join(aa))
# output => Gina Gini Protijayi
11 et 2 fonctionnent parfaitement:
s="the sky is blue very blue"
s=s.lower()
slist = s.split()
print " ".join(sorted(set(slist), key=slist.index))
et 2
s="the sky is blue very blue"
s=s.lower()
slist = s.split()
print " ".join(sorted(set(slist), key=slist.index))
Plusieurs réponses sont assez proches de cela mais ne se sont pas trop bien terminées là où je l'ai fait:
def uniques( your_string ):
seen = set()
return ' '.join( seen.add(i) or i for i in your_string.split() if i not in seen )
Bien sûr, si vous le voulez un peu plus propre ou plus rapide, nous pouvons le refactoriser un peu:
def uniques( your_string ):
words = your_string.split()
seen = set()
seen_add = seen.add
def add(x):
seen_add(x)
return x
return ' '.join( add(i) for i in words if i not in seen )
Je pense que la deuxième version est aussi performante que possible dans une petite quantité de code. (Vous pouvez utiliser davantage de code pour effectuer tout le travail en une seule analyse de la chaîne d'entrée, mais cela devrait être suffisant pour la plupart des charges de travail.)
Vous pouvez supprimer les mots en double ou répétés d'un fichier texte ou d'une chaîne à l'aide des codes suivants:
from collections import Counter
for lines in all_words:
line=''.join(lines.lower())
new_data1=' '.join(lemmatize_sentence(line))
new_data2 = Word_tokenize(new_data1)
new_data3=nltk.pos_tag(new_data2)
# below code is for removal of repeated words
for i in range(0, len(new_data3)):
new_data3[i] = "".join(new_data3[i])
UniqW = Counter(new_data3)
new_data5 = " ".join(UniqW.keys())
print (new_data5)
new_data.append(new_data5)
print (new_data)
P.S. -Effectuez les identifications requises. J'espère que cela vous aidera !!!