【问题标题】:How to remove characters that appear more than once from a string?如何从字符串中删除多次出现的字符?
【发布时间】:2020-06-16 19:17:59
【问题描述】:

所以,我在 IT 课上做了一个类似的练习:“打印一个没有出现多次的字符的字符串(如果出现多次,删除它们)”。我认为这很容易(也许确实如此),但我完全不知道该怎么做。我可以做类似的练习(打印字符串中的所有唯一字符/删除重复项等)。

例子:

输入:'12345555555678'

输出:'1234678'

【问题讨论】:

  • this 会回答你的问题吗?
  • 如果您已经可以删除重复项(以打印唯一字符),那么从该代码开始,展示您如何努力使其适应新问题,并告诉我们您遇到的实际问题。
  • @ivan 和 that 结果将是 12345678 而不是 1234678

标签: python string


【解决方案1】:

这应该看起来像你想要的

input_str = 'ahuadvzudnioqdazvyduazdazdui'
for c in input_str:
    if input_str.count(c)==1:
        print(c)

它更容易理解,但请注意它的性能相当低(O(n^2) 的复杂度)。

为了加快速度,您可以使用列表理解。

input_str = '12345555555678'
[x for x in input_str if input_str.count(x) == 1]

如果元素的顺序对您来说并不重要,那么迭代列表集将是有益的。

如果您使用set(input_str) 将列表转换为集合,那么它将具有唯一值,这可能最终会减少搜索空间。

然后你可以应用列表complrehension。

input_str = '12345555555678'
[x for x in set(input_str) if input_str.count(x) == 1]

注意:不要忘记转换为set后不保留顺序的条件。

【讨论】:

  • 也试过了,但它也会打印一个出现多次的字母,而不是删除它。这是一个类似的答案,但不一样。使用您的代码和输入“zzzzx1”,我得到输出“zx1”,但不是“x1”
【解决方案2】:

你可以使用collections.Counter().

from collections import Counter

inp = '12345555555678'
c = Counter(inp)
output = ''.join(k for k, v in c.items() if v == 1)  # -> 1234678

Counter 的简单实现

c = {}
for char in inp:
    c[char] = c.get(char, 0) + 1

【讨论】:

  • 我不明白这段代码,但它可以工作 :D 谢谢
  • 查看我在回答中链接的文档。写的很好,相信你会明白的:)
  • 因为这是 IT 课练习,你可能不应该使用库,尤其是因为没有它实现起来很简单。
  • 没有图书馆你会怎么做?此外,我的课程允许使用图书馆,但我想知道。
  • @Sorin 没有在问题中指定,但我还是更新了我的答案。
【解决方案3】:

此answer 中描述了此基本算法 - 对于每个字符,您可以通过计算它在字符串中的出现次数来检查它是否出现多次。

但是,这是相当低效的,因为它通过字符串 n ^ 2。您可以通过消耗一些内存来改进它(这在 answer 中进行了说明 - 但被库混淆了)。

然后算法将遍历字符串并计算每个字符的出现次数并将它们保存在某处,然后再次遍历字符串并仅打印计数为 1 的字符。

inp = '1345552225555678'

counts = {};

for ch in inp:
    if ch in counts:
        counts[ch] = counts[ch] + 1
    else:
        counts[ch] = 1

result = '';

for ch in inp:
    if counts[ch] == 1:
        result = result + ch

print result

可以说,这将是 O(n),因为字典的访问时间通常被认为是 O(1)(参见 question 进行讨论)

注意:通常这是使用数字合法字符大小的数组来完成的,但是由于 python 中的字符串是 Unicode,所以数组会很大,但是访问时间确实是 O(1);

【讨论】:

    【解决方案4】:
    i_str =  '12345555555678'
    b = sorted(i_str)
    for i in range(len(b)-1):
        if b[i] == b[i+1]:
            i_str = i_str.replace(b[i],'')
    

    您只需对字符串进行排序并将每个第 n 个元素与下一个元素进行比较。如果不相同,则它是唯一的。

    我也很确定它应该比使用 count 函数更快,该函数将遍历每个唯一元素的所有字符串并检查字符数是否不大于 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      相关资源
      最近更新 更多