web-dev-qa-db-ja.com

Pythonで文字列内の重複する単語を削除するにはどうすればよいですか?

次の例:

string1 = "calvin klein design dress calvin klein"

2番目の2つの重複を削除するにはどうすればよいですか"calvin"および"klein"

結果は次のようになります

string2 = "calvin klein design dress"

2番目の重複のみが削除され、単語のシーケンスは変更されません。

20
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()))
17
spicavigo
string1 = "calvin klein design dress calvin klein"
words = string1.split()
print (" ".join(sorted(set(words), key=words.index)))

これは、文字列内のすべての(一意の)単語のセットを、元の単語リストの単語のインデックスで並べ替えます。

32
Markus

Python 2.7+では、 collections.OrderedDict この場合:

from collections import OrderedDict
s = "calvin klein design dress calvin klein"
print ' '.join(OrderedDict((w,w) for w in s.split()).keys())
10
NPE

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

私は彼らが先に進んで、すぐにそれらのレシピからモジュールを作れることを本当に望んでいます。私はできることをとても望んでいますfrom itertools_recipes import unique_everseen必要になるたびにカットアンドペーストを使用する代わりに。

このように使用してください:

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

セットを使用して、すでに処理された単語を追跡できます。

words = set()
result = ''
for Word in string1.split():
    if Word not in words:
        result = result + Word + ' '
        words.add(Word)
print result
2

これは、文字列に関連付けられたセットを取得するだけで実行できます。これは、定義上、繰り返し要素を含まない数学オブジェクトです。セット内の単語を文字列に結合するだけで十分です。

def remove_duplicate_words(string):
    return ' '.join(set(string.split()))
0
Mffd4n1

質問:文字列の重複を削除します

 from _collections import OrderedDict

    a = "Gina Gini Gini Protijayi"

    aa = OrderedDict().fromkeys(a.split())
    print(' '.join(aa))
   # output => Gina Gini Protijayi
0
Soudipta Dutta

スプリット機能を使用せず(面接に役立ちます)

def unique_words2(a):
    words = []
    spaces = ' '
    length = len(a)
    i = 0
    while i < length:
        if a[i] not in spaces:
            Word_start = i
            while i < length and a[i] not in spaces:
                i += 1
            words.append(a[Word_start:i])
        i += 1
    words_stack = []
    for val in words:  #
        if val not in words_stack:  # We can replace these three lines with this one -> [words_stack.append(val) for val in words if val not in words_stack]
            words_stack.append(val)  #
    print(' '.join(words_stack))  # or return, your choice


unique_words2('calvin klein design dress calvin klein') 
0
Rishbh Verma

11と2は完全に機能します。

    s="the sky is blue very blue"
    s=s.lower()
    slist = s.split()
    print " ".join(sorted(set(slist), key=slist.index))

と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

いくつかの答えはこれにかなり近いですが、私がやったところに完全に終わっていません:

def uniques( your_string ):    
    seen = set()
    return ' '.join( seen.add(i) or i for i in your_string.split() if i not in seen )

もちろん、少しクリーンにしたい場合は、少しリファクタリングできます。

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 )

2番目のバージョンは、少量のコードで実行できるのと同じくらいパフォーマンスが高いと思います。 (より多くのコードを使用して、入力文字列全体で1回のスキャンですべての作業を行うことができますが、ほとんどのワークロードでは、これで十分です。)

0
Chris Phillips

次のコードを使用して、テキストファイルまたは文字列から重複した単語または繰り返された単語を削除できます-

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)

追伸-必要に応じてIDを実行します。お役に立てれば!!!

0
rahul ranjan