【问题标题】:Counting occurrence of all characters in string but only once if character is repeated [duplicate]计算字符串中所有字符的出现,但如果字符重复则仅出现一次[重复]
【发布时间】:2017-02-06 16:48:53
【问题描述】:

注意:请确保这不是重复的,我正在尝试找到一种班轮方式。

我正在尝试将用 ascii 字母填充的字符串转换为用 ascii 字母填充的字符串。

例如: string1 = 'abc'.

要将其转换为充满 ascii 字母的字符串,我只需使用一行命令:

string2 = [string1.count(l) for l in string1]

这会输出:

[1, 1, 1]


但是如果我在string1中有多个重复的字符,它看起来会有所不同。

例如:string1 = 'aaabbbccc'

并对其进行改造:

string2 = [string1.count(l) for l in string1]

输出将是:

[3, 3, 3, 3, 3, 3, 3, 3, 3]


如您所见,字符出现是重复的,我不知道如何制作一个仅打印单个字母出现一次的生成器。

例如:

代替:

[3, 3, 3, 3, 3, 3, 3, 3, 3]

有没有办法用单行生成器输出这个?

[3, 3, 3]

【问题讨论】:

  • aabaab 的预期输出是什么,其中重复字符不相邻?
  • 使用 collections.Counterdict 。我在您的问题中没有看到任何生成器。
  • Counter('aaabbbccc') -> Counter({'b': 3, 'a': 3, 'c': 3})

标签: python string generator


【解决方案1】:

使用collections.Counter:

>>> from collections import Counter
>>> Counter('aaabbbccc')
Counter({'a': 3, 'b': 3, 'c': 3})

您可以通过使用string.ascii_lowercase 迭代计数器来轻松地将计数作为排序列表:

>>> import string
>>> c = Counter('aaabbbccc')
>>> [c[l] for l in string.ascii_lowercase]
[3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

【讨论】:

  • 谢谢,但我想更容易地将其转换为字符串类型,有没有简单的方法?
  • @ShellRox 您正在尝试将什么转换为字符串类型?我没有那个。在这种情况下,您希望结果为 '333' 吗?
  • @MoinuddinQuadri 我正在尝试输出没有数组形式的数字,抱歉我没有提到问题。
  • @Uriel Eli 你是真正的读心者
【解决方案2】:

您可以在一行中使用OrderedCounter

>>> from collections import Counter, OrderedDict
>>> class OrderedCounter(Counter, OrderedDict): 
...     pass
...
>>> OrderedCounter('aaabbbccc').values()
[3, 3, 3]

【讨论】:

    【解决方案3】:

    使用set:

    >>> [string1.count(l) for l in set(string1)]
    [3, 3, 3]
    

    Set 将字符串转换为一组不同的字符:例如aabcabbc 以及 acb 将变成 {'a', 'b', 'c'}

    这是您要查找的输出,但您不知道哪个 3 对应哪个字符,所以最后最好使用建议的 Counter 方法

    【讨论】:

    • 你好,你知道这个输出怎么也能很容易地变成一个字符串吗?不用括号,谢谢!
    猜你喜欢
    • 2012-05-31
    • 2020-06-02
    • 2011-03-02
    • 2021-08-04
    • 2020-06-14
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多