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

Mat*_*Mat 909 python string count

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

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

Ogr*_*des 1271

str.count(sub [,start [,end]])

返回sub范围中子字符串的非重叠出现次数[start, end].可选参数start,end并以切片表示法解释.

>>> sentence = 'Mary had a little lamb'
>>> sentence.count('a')
4
Run Code Online (Sandbox Code Playgroud)

  • 尽管您可能希望使用 `sentence.lower().count('a')` 删除大小写依赖性 (2认同)

edu*_*ffy 142

你可以使用count():

>>> 'Mary had a little lamb'.count('a')
4
Run Code Online (Sandbox Code Playgroud)


Bre*_*own 103

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

from collections import Counter
my_str = "Mary had a little lamb"
counter = Counter(my_str)
print counter['a']
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要给定字符串中很多字母的计数,Counter会以更简洁的形式提供它们.如果你想从很多不同的字符串中得到一个字母的计数,Counter就没有任何好处. (20认同)
  • 为什么经常使用会更好?有什么好处? (14认同)
  • 经常使用的优点是Counter计算所有计数一次,这几乎与一次执行myst​​ring.count('a')一样快.因此,如果你这样做20次,你可以节省10倍的计算时间.计数器还可以告诉您项目是否在字符串中:例如,如果计数器中的'a': (5认同)
  • 对于这个特殊的实例,计算字符,我更喜欢collections.counter.为了查找特定子字符串的实例,我将使用正则表达式或str.count()方法.我没有测试过,但由于计算所有字符并附加到字典而不是计算单个子字符串的出现次数,所以可能存在性能差异.我建议编写一个脚本来生成一个很长的文件来搜索,然后定时执行每个方法. (2认同)

Sin*_*our 47

正则表达式可能?

import re
my_string = "Mary had a little lamb"
len(re.findall("a", my_string))
Run Code Online (Sandbox Code Playgroud)

  • 一个好主意,但在这种情况下矫枉过正.字符串方法'count'可以做同样的事情,并且可以立即明显地了解它正在做什么. (28认同)
  • 为什么负面率,也许有人需要这种类似的代码.我的投票 (17认同)
  • 这应该是downvoted,因为它是计算字符串中字符的最低效方法.如果目标只是计算字符数,正如问题所示,很难找到更糟糕的方法来完成这项工作.在内存和处理器开销方面,绝对应该避免使用此解决方案.没有人会"需要"使用此方法来查找字符串中的字符数. (11认同)

Nun*_*dré 13

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

这项工作的更好方法是:

from collections import defaultdict

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

for char in text:
    chars[char] += 1
Run Code Online (Sandbox Code Playgroud)

因此,您将拥有一个dict,它返回字符串中每个字母的出现次数以及0它是否不存在.

>>>chars['a']
4
>>>chars['x']
0
Run Code Online (Sandbox Code Playgroud)

对于不区分大小写的计数器,您可以通过子类化来覆盖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
Run Code Online (Sandbox Code Playgroud)


jaf*_*lds 9

如果你想要不区分大小写(当然还有正则表达式的所有功能),正则表达式非常有用.

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))
Run Code Online (Sandbox Code Playgroud)

请注意,正则表达式版本的运行时间大约为十倍,这可能仅在my_string非常长或代码在深层循环内时才会出现问题.

  • 如果您只是想修复区分大小写的问题,正则表达式就太过分了。my_sting.lower().count('m') 更高效、更清晰、更简洁。 (3认同)

Eri*_*nga 9

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

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

check_freq("abbabcbdbabdbdbabababcbcbab")
{'a': 7, 'b': 14, 'c': 3, 'd': 3}
Run Code Online (Sandbox Code Playgroud)

  • 您正在遮蔽`str`。如果将其名称赋予变量,则`str`不再是内置类型。同样,您正在计数十四次b的十四次。您可以通过将`for c in text`更改为`for c in set(text)`来避免这种情况。 (2认同)

小智 7

使用次数:

sentence = 'A man walked up to a door'
print(sentence.count('a'))
# 4
Run Code Online (Sandbox Code Playgroud)


Aiv*_*erg 6

我不知道“最简单”,但简单的理解可以做到:

>>> my_string = "Mary had a little lamb"
>>> sum(char == 'a' for char in my_string)
4
Run Code Online (Sandbox Code Playgroud)

利用内置的 sum、生成器理解以及 bool 是整数的子类这一事实:字符等于“a”的次数有多少。


小智 5

a = 'have a nice day'
symbol = 'abcdefghijklmnopqrstuvwxyz'
for key in symbol:
    print key, a.count(key)
Run Code Online (Sandbox Code Playgroud)