在一个字符串中计算一个字符出现的次数。

1286

如何统计字符串中某个字符出现的次数?

例如,在字符串“Mary had a little lamb”中,“a”出现了4次。


为了交叉检查基于下面的最佳答案的结果,您还可以使用此工具。 - WJA
你可能会找到编码的最简单方法,但最终,无论我们使用循环还是内置的count()函数,时间复杂度仍然保持不变。 - Makarand
26个回答

6

我不知道什么是“最简单的”,但简单的理解就可以了:

>>> my_string = "Mary had a little lamb"
>>> sum(char == 'a' for char in my_string)
4

利用内置的sum函数、生成器表达式和布尔值是整数子类的事实:有多少次字符等于'a'。

5

使用计数:

sentence = 'A man walked up to a door'
print(sentence.count('a'))
# 4

5

我是pandas库的粉丝,特别是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
非常慢,但如果已经在pandas中有数据,则仍然有用。 - WestCoastProjects

4

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'。

4

获取所有字符计数的另一种方式,不使用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)

3

我知道要求是计算特定字母的数量。我在此编写通用代码,不使用任何方法。

sentence1 =" Mary had a little lamb"
count = {}
for i in sentence1:
    if i in count:
        count[i.lower()] = count[i.lower()] + 1
    else:
        count[i.lower()] = 1
print(count)

输出

{' ': 5, 'm': 2, 'a': 4, 'r': 1, 'y': 1, 'h': 1, 'd': 1, 'l': 3, 'i': 1, 't': 2, 'e': 1, 'b': 1}

现在,如果您想要任何特定的字母频率,可以像下面这样打印。
print(count['m'])
2

3

最简单的方法是在一行代码中编写:

'Mary had a little lamb'.count("a")

但如果你想的话,也可以使用这个:
sentence ='Mary had a little lamb'
   count=0;
    for letter in sentence :
        if letter=="a":
            count+=1
    print (count)

二十二个答案。排名第一的答案获得的赞数比我在 Stack Overflow 上八年内总共收到的赞数还要多。你为什么喜欢这个解决方案?它有什么贡献是现有答案所缺少的? - Jeremy Caney
没有人提到Python中的类方法,这是最简单和最短的方式。 - fsafarkhani
现在,我看到他们提到了它!没关系,我只是想展示我的代码。我认为没有人提到它。 - fsafarkhani

3
a = "I walked today,"
c=['d','e','f']
count=0
for i in a:
    if str(i) in c:
        count+=1

print(count)

这不区分d、e、f的计数。 - Gino Mempin
嗨@GinoMempin,我认为这里的意图不是要区分,但如果您希望这样做,您可以声明另外两个变量并将i分别与'd'、'e'和'f'进行比较。 - Kquek

2
为了在句子中查找字符的出现情况,您可以使用以下代码:
首先,我从句子中取出了唯一的字符,然后计算了每个字符在句子中的出现次数,这包括空格的出现次数。
ab = set("Mary had a little lamb")

test_str = "Mary had a little lamb"

for i in ab:
  counter = test_str.count(i)
  if i == ' ':
    i = 'Space'
  print(counter, i)

上述代码的输出如下。
1 : r ,
1 : h ,
1 : e ,
1 : M ,
4 : a ,
1 : b ,
1 : d ,
2 : t ,
3 : l ,
1 : i ,
4 : Space ,
1 : y ,
1 : m ,

下投票。这是 https://dev59.com/7nM_5IYBdhLWcg3w9oIA#49385352 的重复,它只是通过 ''.join() 制造了不必要的方式。 - questionto42
@-questionto42,您能否详细解释一下您所说的重复意义?我同意您关于使用连接的观点,并已将其删除。谢谢! - Shreyansh Dwivedi
另一个答案先出现了,它也有一个字符串的set(),循环遍历以检查集合中每个字母的count()。它将结果添加到字典的键中,并在之后打印字典,而不是这个答案在循环期间直接打印计数(打印结果的方式不是主要问题)。因此出现了重复。 - questionto42
1
@questionto42 这个概念可以被任何人使用,相同的想法可能会出现在不同的头脑中,但当你说答案是重复的时候,我要说这不是因为我已经阅读了你在评论中提到的stackoverflow,在那个答案和我的答案中有一个区别,那就是空格字符没有被计算,在我的答案中它被计算了,所以它不是一个重复的答案,因为重复的意思是每件事情都应该完全相同。请注意这一点,如果您认为这个解释是正确的,那么您可以撤销您的负评。 - Shreyansh Dwivedi
1
我看了一下。另一个解决方案会给你一个以 ' ' 为键,以 ' ' 数量为值的字典。你可以使用 pop 将字典的键重命名为任何你喜欢的名称,比如将 ' ' 改为 space,但这并没有增加价值。我仍然撤回我的踩票,因为有人可能想要一个不带字典的解决方案。然而,这是一个重复的问题,主要的技巧只是 set()count(),你重复了它们。 - questionto42

2

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接