web-dev-qa-db-fra.com

Comment puis-je supprimer les mots en double dans une chaîne avec Python?

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é!

16
burner007
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()))
15
spicavigo
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.

29
Markus

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())
7
NPE

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)
7
Lauritz V. Thaulow
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)
5
ekhumoro

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
2
Pablo Santa Cruz

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()))
0
Mffd4n1

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
0
Soudipta Dutta

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))
0
the chib

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

0
Chris Phillips

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 !!!

0
rahul ranjan