【问题标题】:Searching for duplicates and remove them搜索重复项并将其删除
【发布时间】:2020-03-06 13:36:19
【问题描述】:

有时我有这样的字符串

string = "Hett, Agva,"

有时我会在其中重复。

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

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

更新。

所以在第二个字符串中我需要删除 Agva 和 Hett,因为字符串中有 2x 个

【问题讨论】:

  • ',' 也是重复的吗?你如何定义重复?
  • 如果有 2 个 Agva,我需要移除一个
  • 去除重复后需要维护秩序吗?
  • 所以出现两次的'Hett' 不会打扰您。您必须对定义稍作调整。如果只是'Agva'你还不如重写字符串。
  • OP 希望 all 删除重复项,然后是 HettAgvablah

标签: python python-2.7


【解决方案1】:

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

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),因为 Python 必须遍历列表直到找到元素。这意味着此任务使用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

【讨论】:

  • 但是赫特,也是重复的,
  • @Chaban33 我的错,需要去掉前导空格...现在可以了:)
  • 感谢您的精彩解释
  • @Chaban33 谢谢。
【解决方案2】:

您可以使用toolz.unique,或等效的itertools 文档中的unique_everseen recipe,或等效的@JoeIddon 的显式解决方案。

这是使用第 3 方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】:

    如果您只会收到这种格式的字符串,那么您可以执行以下操作:

    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】:

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

      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,'
      

      【讨论】:

      • 一旦你列出了only 个单词没有 逗号,只需执行set(list_name) 就可以了。例如。 x = ['a', 'b', 'a']set(x) 给出 {'a', 'b'}。可以进一步转换为列表
      • @Bazingaa 不,因为那样你就会失去订单。我的逻辑是必要的。
      • @Bazingaa; OP 没有指定是否要删除“,”。所以我保持原样。
      • 这不如使用集合高效,请参阅我的回答。
      • @JoeIddon:好吧,除非 OP 指定必须保持订单,否则我们不知道。
      【解决方案5】:

      快速简便的方法:

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

      希望对您有所帮助。有什么不明白的欢迎追问:)

      【讨论】:

        猜你喜欢
        • 2012-05-07
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-11
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        相关资源
        最近更新 更多