次の例:
string1 = "calvin klein design dress calvin klein"
2番目の2つの重複を削除するにはどうすればよいですか"calvin"
および"klein"
?
結果は次のようになります
string2 = "calvin klein design dress"
2番目の重複のみが削除され、単語のシーケンスは変更されません。
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)))
これは、文字列内のすべての(一意の)単語のセットを、元の単語リストの単語のインデックスで並べ替えます。
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())
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)
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)
セットを使用して、すでに処理された単語を追跡できます。
words = set()
result = ''
for Word in string1.split():
if Word not in words:
result = result + Word + ' '
words.add(Word)
print result
これは、文字列に関連付けられたセットを取得するだけで実行できます。これは、定義上、繰り返し要素を含まない数学オブジェクトです。セット内の単語を文字列に結合するだけで十分です。
def remove_duplicate_words(string):
return ' '.join(set(string.split()))
質問:文字列の重複を削除します
from _collections import OrderedDict
a = "Gina Gini Gini Protijayi"
aa = OrderedDict().fromkeys(a.split())
print(' '.join(aa))
# output => Gina Gini Protijayi
スプリット機能を使用せず(面接に役立ちます)
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')
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))
いくつかの答えはこれにかなり近いですが、私がやったところに完全に終わっていません:
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回のスキャンですべての作業を行うことができますが、ほとんどのワークロードでは、これで十分です。)
次のコードを使用して、テキストファイルまたは文字列から重複した単語または繰り返された単語を削除できます-
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を実行します。お役に立てれば!!!