不幸的是,内置字符串计数函数不支持在一次调用中对多个字符进行计数。其他受访者都使用多次电话字符串计数并对数据进行多次传递。我相信您的问题表明您不想拆分通话。
如果您希望仅在一次调用中进行单遍搜索,还有其他几种方法。
一种方法是使用正则表达式,例如len(re.findall(r'[ab]', s))
它计算的数量a or b一次通过的字符。您甚至可以以节省内存的迭代器形式执行此操作,sum(1 for _ in re.finditer(r'[ab]', s))
.
另一种方法将集合与filter https://docs.python.org/2.7/library/functions.html#filter。例如,len(filter({'a', 'b'}.__contains__, s))
还统计了数量a or b一次通过的字符。您还可以通过一种节省内存的迭代器形式来执行此操作,sum(1 for _ in itertools.ifilter({'a', 'b'}.__contains__, s))
.
>>> s = 'abracadabra'
>>> re.findall(r'[ab]', s)
['a', 'b', 'a', 'a', 'a', 'b', 'a']
>>> filter({'a', 'b'}.__contains__, s)
'abaaaba'
只是为了笑,还有另一种方法,但有点另类,len(s) - len(s.translate(None, 'ab'))
。这从总字符串长度开始,减去翻译字符串的长度,其中a and b字符已被删除。
旁注:在 Python 3 中,filter()已更改为返回迭代器。所以新的代码将变成len(list(filter({'a', 'b'}.__contains__, s)))
and sum(1 for _ in filter({'a', 'b'}.__contains__, s))
.