注意:请确保这不重复,我试图找到一种方法。
我正在尝试将填充了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]
答案 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将字符串转换为一组不同的字符:例如aabc
和abbc
以及acb
将变为{'a', 'b', 'c'}
这是你要查找的输出,但你不知道哪个是哪个字符,所以最后你最好使用建议的Counter
方法