Подтвердить что ты не робот

Как удалить повторяющиеся слова в строке с помощью Python?

Следующий пример:

string1 = "calvin klein design dress calvin klein"

Как удалить два дубликата "calvin" и "klein"?

Результат должен выглядеть как

string2 = "calvin klein design dress"

нужно удалить только два дубликата, а последовательность слов не должна изменяться!

4b9b3361

Ответ 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()))

Ответ 2

string1 = "calvin klein design dress calvin klein"
words = string1.split()
print " ".join(sorted(set(words), key=words.index))

Сортирует набор всех (уникальных) слов в вашей строке индексом слова в исходном списке слов.

Ответ 3

Вырезать и вставить из рецепты 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)

Ответ 4

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

Ответ 5

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)

Ответ 6

Вы можете использовать набор для отслеживания уже обработанных слов.

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

Ответ 7

Несколько ответов довольно близки к этому, но не совсем закончились тем, что я сделал:

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 )

Я думаю, что вторая версия примерно такая же эффективная, как вы можете получить в небольшом количестве кода. (Больше кода можно использовать для выполнения всей работы в одном сканировании во входной строке, но для большинства рабочих нагрузок это должно быть достаточно.)

Ответ 8

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