代码之家  ›  专栏  ›  技术社区  ›  Chaban33

搜索并删除重复项

  •  1
  • Chaban33  · 技术社区  · 6 年前

    string = "Hett, Agva,"
    

    有时我会有重复的。

    string = "Hett, Agva, Delf, Agva, Hett,"
    

    如何检查我的字符串是否有重复项,然后删除它们?

    所以在第二根弦中,我需要去掉Agva和Hett,因为弦中有2个

    5 回复  |  直到 6 年前
        1
  •  2
  •   Joe Iddon    6 年前

    迭代各个部分(单词),并将每个部分添加到一组可见的部分中,如果不在该组中,则添加到一个部分列表中。最后。重建字符串:

    seen = set()
    parts = []
    for part in string.split(','):
        if part.strip() not in seen:
            seen.add(part.strip())
            parts.append(part)
    
    no_dups = ','.join(parts)
    

    (请注意,我必须向 .strip() 因为有些单词的开头有空格,所以这个方法会删除)

    它给出:

    'Hett, Agva, Delf,'
    

    为什么要用一套?

    查询元素是否为 in 一套, it is O(1) average case -因为它们是由散列存储的,所以查找时间是恒定的。另一方面,在列表中查找 O(n) set 因为,对于每个新词,您可以立即检查是否以前在中看到过,而您必须在 list 否则,一个大的列表需要更长的时间。


    哦,为了检查是否有重复项,请查询拆分列表的长度是否与该列表的集合相同(这会删除重复项,但会降低顺序)。

    def has_dups(string):
        parts = string.split(',')
        return len(parts) != len(set(parts))
    

    效果如预期:

    >>> has_dups('Hett, Agva,')
    False
    >>> has_dups('Hett, Agva, Delf, Agva, Hett,')
    True
    
        2
  •  1
  •   jpp    6 年前

    你可以用 toolz.unique ,或相当于 unique_everseen recipe itertools

    下面是使用第三方的解决方案 toolz :

    x = "Hett, Agva, Delf, Agva, Hett,"
    
    from toolz import unique
    
    res = ', '.join(filter(None, unique(x.replace(' ', '').split(','))))
    
    print(res)
    
    'Hett, Agva, Delf'
    

    filter 清理拖尾 ,

        3
  •  1
  •   Imtinan Azhar    6 年前

    如果只接收此格式的字符串,则可以执行以下操作:

    import numpy as np
    
    string_words=string.split(',')
    uniq_words=np.unique(string_words)
    
    string=""
    for word in uniq_words:
        string+=word+", "
    string=string[:-1]
    

        4
  •  1
  •   haccks    6 年前

    如果单词的顺序很重要,那么可以在字符串中创建单词列表,然后遍历该列表以创建唯一单词的新列表。

    string = "Hett, Agva, Delf, Agva, Hett,"
    words_list = string.split()
    
    unique_words = []
    [unique_words.append(w) for w in words_list if w not in unique_words]
    new_string = ' '.join(unique_words)
    print (new_String)
    

    'Hett, Agva, Delf,'
    
        5
  •  0
  •   Nimeshka Srimal    4 年前

    快速简便的方法:

    ', '.join(
             set(
                 filter( None, [ i.strip() for i in string.split(',') ] )
             )
         )
    

    希望有帮助。如果有什么不清楚的地方,请随时询问:)