计算字符串中所有字符的出现次数,但如果重复字符则只计算一次

时间:2017-02-06 16:48:53

标签: python string generator

注意:请确保这不重复,我试图找到一种方法。

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

例如:  df <- data.frame(x = sample(c(1:10,NA),1000, replace = T)) window <- 10 lapply(1:(nrow(df)-window), function(x) ifelse(is.na(df[x,'x']),mean(df[x:(x+10),'x'],na.rm=T),df[x,'x']))

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

string1 = 'abc'

这会输出:

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

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

例如:[1, 1, 1]

转变它:

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 个答案:

答案 0 :(得分:4)

您可以使用OrderedCounter在一行中执行此操作。

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

答案 1 :(得分:4)

使用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]

答案 2 :(得分:0)

使用set

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

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

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