Ответ 1
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"
Как удалить два дубликата "calvin"
и "klein"
?
Результат должен выглядеть как
string2 = "calvin klein design dress"
нужно удалить только два дубликата, а последовательность слов не должна изменяться!
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))
Сортирует набор всех (уникальных) слов в вашей строке индексом слова в исходном списке слов.
Вырезать и вставить из рецепты 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)
В 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())
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 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 )
Я думаю, что вторая версия примерно такая же эффективная, как вы можете получить в небольшом количестве кода. (Больше кода можно использовать для выполнения всей работы в одном сканировании во входной строке, но для большинства рабочих нагрузок это должно быть достаточно.)
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))