我想知道是否可以使用.count函数计算多个字符串?
string = "abcdefg"
string.count("." or "!")
当我使用or命令时,它只给出了1个变量的计数,但我想要总数。你如何将它组合起来,使它在没有将它分成两个函数的情况下计算2个字符串?
由于
答案 0 :(得分:3)
不幸的是,内置的 str.count 函数不支持在单个调用中执行多个字符的计数。其他受访者都使用多次调用 str.count 并对数据进行多次传递。我相信你的问题指出你不想拆分电话。
如果您只希望在一次通话中进行单次通过搜索,还有其他几种方式。
一种方法是使用len(re.findall(r'[ab]', s))
这样的正则表达式,它在一次传递中计算 a 或 b 字符的数量。您甚至可以使用内存有效的迭代器形式sum(1 for _ in re.finditer(r'[ab]', s))
来执行此操作。
另一种方法是将集合与filter一起使用。例如,len(filter({'a', 'b'}.__contains__, s))
也会计算单次传递中 a 或 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 和 b 字符的已翻译字符串的长度。
附注:在Python 3中, filter()已更改为返回迭代器。因此,新代码将变为len(list(filter({'a', 'b'}.__contains__, s)))
和sum(1 for _ in filter({'a', 'b'}.__contains__, s))
。
答案 1 :(得分:1)
你可以使用一个计数器:简单但可能没有内存效率。
string_ = "abcdefg"
from collections import Counter
counter = Counter(string_)
sum_ = counter['.'] + counter['!']
你也可以简单地使用sum
(更好)的列表理解:
string_ = "abcdefg"
sum_ = sum(1 for c in string_ if c in '.!' else 0)
答案 2 :(得分:0)
您可以使用sum
方法获取总数。
string = "abcdefg.a.!"
print(sum(string.count(i) for i in '.!'))
输出:
3
答案 3 :(得分:0)
or
语句将选择.
,因为它不是None
,方法count
将永远不会看到感叹号。但是,它也无法处理两个独立的字符串。所以你需要单独完成这个。
string.count(".") + string.count("!")
答案 4 :(得分:0)
您可以使用:
string.replace("!",".").count(".")
从性能的角度来看,我不希望这里有任何好处,因为字符串需要解析两次。但是,如果你的主要动机是计算单行中的字符(例如myFunctionReturnsString().replace("!",".").count(".")
),这可能会有所帮助
答案 5 :(得分:0)
不使用count()
,您可以将原始字符串和搜索字符串拆分为数组,然后检查重叠数组的长度
s = list('abcdefg.a.!')
t = list('.!')
print len([i for i in s if i in t])
>> 3
答案 6 :(得分:0)
您可以使用此代码,并将其设置为变量,然后打印该变量。
text.count(".") + text.count("?") + text.count("!")
例如:
count = text.count(".") + text.count("?") + text.count("!")
print(count)
3