如何使用Python删除字符串中的重复单词?

bur*_*007 20 python string duplicates

以下示例:

string1 = "calvin klein design dress calvin klein"
Run Code Online (Sandbox Code Playgroud)

我怎样才能删除第二个一式两份"calvin",并"klein"

结果应该是这样的

string2 = "calvin klein design dress"
Run Code Online (Sandbox Code Playgroud)

只应删除第二个重复项,并且不应更改单词的顺序!

Mar*_*kus 33

string1 = "calvin klein design dress calvin klein"
words = string1.split()
print (" ".join(sorted(set(words), key=words.index)))
Run Code Online (Sandbox Code Playgroud)

这会根据原始单词列表中的单词索引对字符串中所有(唯一)单词的集合进行排序.


spi*_*igo 19

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()))
Run Code Online (Sandbox Code Playgroud)

  • 我发现你使用附加列表理解令人不安. (11认同)
  • 不幸的是它是O(N²) - 每次都会在整个`ulist'中出现'in`.不要将它用于长列表. (9认同)
  • 列表推导式是不合适的,除非您使用输出,否则不应使用。使用适当的`for x in l: if x not in ulist: ulist.append(x)`。 (2认同)

NPE*_*NPE 12

在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())
Run Code Online (Sandbox Code Playgroud)

  • `''.join(OrderedDict.fromkeys(s.split()))`. (3认同)

Lau*_*low 7

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
Run Code Online (Sandbox Code Playgroud)

我真的希望他们能够继续前进,尽快从这些食谱中制作一个模块.我非常希望能够在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)
Run Code Online (Sandbox Code Playgroud)


And*_*bov 7

string2 = ' '.join(set(string1.split()))
Run Code Online (Sandbox Code Playgroud)

解释

.split()- 它是一种将字符串拆分为列表的方法(没有参数,它按空格拆分)
set()- 它是排除重复项的无序集合类型
'separator'.join(list)- 意味着您希望使用元素之间的“分隔符”将列表从参数连接到字符串

  • 这可能会改变字符串中单词的顺序。 (5认同)

ekh*_*oro 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)
Run Code Online (Sandbox Code Playgroud)