计算字符串中字符的出现次数


953

计算字符串中字符出现次数的最简单方法是什么?

例如计算'a'出现在其中的次数'Mary had a little lamb'

Answers:




112

正如其他答案所说,使用字符串方法count()可能是最简单的方法,但是如果您经常这样做,请查看collections.Counter

from collections import Counter
my_str = "Mary had a little lamb"
counter = Counter(my_str)
print counter['a']

15
为什么经常使用会更好呢?有什么好处?
网状

21
如果要给定字符串中很多字母的计数,Counter会以更简洁的形式提供所有字母。如果要从许多不同的字符串中对一个字母计数,Counter将无济于事。
布伦登·布朗

2
对于这个特定的实例,计数字符,我更喜欢collections.counter。为了查找特定子字符串的实例,我将使用正则表达式或str.count()方法。我还没有测试过,但是由于计算所有字符并追加到字典而不是计算单个子字符串的出现会产生一些开销,因此可能会有性能差异。我建议编写一个脚本以生成一个非常长的文件以进行搜索,然后定时执行每种方法。
Daniel B.

5
经常使用的好处是Counter可以一次计算所有计数,这几乎与一次执行myst​​ring.count('a')一样快。因此,如果您执行20次,则可能节省了10倍的计算时间。计数器还可以告诉您项目是否在字符串中:例如,计数器中是否包含“ a”:
BAMF4bacon,2016年

51

正则表达式可能吗?

import re
my_string = "Mary had a little lamb"
len(re.findall("a", my_string))

30
一个很好的主意,但在这种情况下过大了。字符串方法“ count”执行相同的操作,但额外的好处是可以立即清楚地知道它在做什么。
nilamo

18
为什么是负利率,也许有人需要类似的代码来做类似的事情。我的票了
kiltek

12
这应该被否决,因为这是对字符串中的字符进行计数的最无效的方法。如问题所示,如果目标只是简单地计算字符,将很难找到更差的方法来完成这项工作。在内存和处理器开销方面,绝对必须避免这种解决方案。没有人会“需要”使用这种方法来查找字符串中的字符数。
克里斯托弗·

1
@kiltek确实,这个小片段对我有用,它的正则表达式稍微复杂一些
Speccy

当字符串方法不可用时,一个好的解决方案:len(re.findall('1',bin(10)))
Conor



13

str.count(a)是计算字符串中单个字符的最佳解决方案。但是,如果您需要计算更多的字符,则必须读取整个字符串与要计算的字符一样多的次数。

这项工作的更好方法是:

from collections import defaultdict

text = 'Mary had a little lamb'
chars = defaultdict(int)

for char in text:
    chars[char] += 1

因此,您将拥有一个dict,它返回字符串中每个字母(0如果不存在)的出现次数。

>>>chars['a']
4
>>>chars['x']
0

对于不区分大小写的计数器,您可以通过子类化来覆盖mutator和accessor方法defaultdict(基类的方法是只读的):

class CICounter(defaultdict):
    def __getitem__(self, k):
        return super().__getitem__(k.lower())

    def __setitem__(self, k, v):
        super().__setitem__(k.lower(), v)


chars = CICounter(int)

for char in text:
    chars[char] += 1

>>>chars['a']
4
>>>chars['M']
2
>>>chars['x']
0

您基本上是在重新实现Counter,它已经是中的一个类collections
merv

@merv不是。Counter是一种更纯臃肿Python类和defaultdict__missing__用C语言编写。对于像这样的简单任务(int也在C语言中实现),这种方法速度更快。
NunoAndré17年

11

这个简单而直接的功能可能会有所帮助:

def check_freq(x):
    freq = {}
    for c in x:
       freq[c] = str.count(c)
    return freq

check_freq("abbabcbdbabdbdbabababcbcbab")
{'a': 7, 'b': 14, 'c': 3, 'd': 3}

3
你在影子str。如果将其名称指定给变量,str则不再是内置类型。同样,您正在计数十四次b的十四次。您可避免简单地通过改变for c in textfor c in set(text)
努诺·安德烈

10

如果要区分大小写(当然还有正则表达式的全部功能),则正则表达式非常有用。

my_string = "Mary had a little lamb"
# simplest solution, using count, is case-sensitive
my_string.count("m")   # yields 1
import re
# case-sensitive with regex
len(re.findall("m", my_string))
# three ways to get case insensitivity - all yield 2
len(re.findall("(?i)m", my_string))
len(re.findall("m|M", my_string))
len(re.findall(re.compile("m",re.IGNORECASE), my_string))

请注意,正则表达式版本的运行时间大约是其十倍,这仅在my_string非常长或代码处于深循环内时才可能是一个问题。


1
如果您只是想解决大小写敏感问题,那么正则表达式就显得过于矫kill过正。my_sting.lower()。count('m')性能更高,更清晰,更简洁。
食人魔代码

5
a = 'have a nice day'
symbol = 'abcdefghijklmnopqrstuvwxyz'
for key in symbol:
    print key, a.count(key)

2
str = "count a character occurance"

List = list(str)
print (List)
Uniq = set(List)
print (Uniq)

for key in Uniq:
    print (key, str.count(key))

2

另一种方式来获得所有的字符数不使用Counter()count和正则表达式

counts_dict = {}
for c in list(sentence):
  if c not in counts_dict:
    counts_dict[c] = 0
  counts_dict[c] += 1

for key, value in counts_dict.items():
    print(key, value)

1

count绝对是计算字符串中字符出现次数的最简洁,最有效的方法,但是我尝试使用解决方案lambda,例如:

sentence = 'Mary had a little lamb'
sum(map(lambda x : 1 if 'a' in x else 0, sentence))

这将导致:

4

同样,这样做还有一个好处,如果该句子是包含与上述相同字符的子字符串列表,则由于使用,这也会给出正确的结果in。看一看 :

sentence = ['M', 'ar', 'y', 'had', 'a', 'little', 'l', 'am', 'b']
sum(map(lambda x : 1 if 'a' in x else 0, sentence))

这也导致:

4

当然,这仅在检查单个字符的出现(例如'a'在这种特殊情况下)时才起作用。


0

“不使用count来查找想要的字符串中的字符”方法。

import re

def count(s, ch):

   pass

def main():

   s = raw_input ("Enter strings what you like, for example, 'welcome': ")  

   ch = raw_input ("Enter you want count characters, but best result to find one character: " )

   print ( len (re.findall ( ch, s ) ) )

main()

7
为什么要使用空计数功能?为什么要使用main()函数?为什么到处都是丑陋的空间?这不是一个好答案。
bugmenot123

0

我是熊猫图书馆的粉丝,尤其是value_counts()方法。您可以使用它来计算字符串中每个字符的出现:

>>> import pandas as pd
>>> phrase = "I love the pandas library and its `value_counts()` method"
>>> pd.Series(list(phrase)).value_counts()
     8
a    5
e    4
t    4
o    3
n    3
s    3
d    3
l    3
u    2
i    2
r    2
v    2
`    2
h    2
p    1
b    1
I    1
m    1
(    1
y    1
_    1
)    1
c    1
dtype: int64

-1
spam = 'have a nice day'
var = 'd'


def count(spam, var):
    found = 0
    for key in spam:
        if key == var:
            found += 1
    return found
count(spam, var)
print 'count %s is: %s ' %(var, count(spam, var))

-1

Python 3

有两种方法可以实现此目的:

1)内置函数count()

sentence = 'Mary had a little lamb'
print(sentence.count('a'))`

2)不使用功能

sentence = 'Mary had a little lamb'    
count = 0

for i in sentence:
    if i == "a":
        count = count + 1

print(count)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.