文字列内の文字の出現回数を数える


954

文字列内の文字の出現回数を数える最も簡単な方法は何ですか?

例えば、'a'出現回数を数える'Mary had a little lamb'

回答:




112

他の答えが言うように、文字列メソッドcount()を使用するのがおそらく最も簡単ですが、これを頻繁に行う場合は、collections.Counterをチェックしてください。

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

15
頻繁に使用すると、なぜこれが優れているのですか?利点は何ですか?
メッシュ状の2015

21
特定の文字列の多くの文字の数が必要な場合、Counterはそれらすべてをより簡潔な形式で提供します。多数の異なる文字列からの1文字のカウントが必要な場合、Counterは何のメリットもありません。
ブレンデンブラウン

2
文字をカウントするこの特定のインスタンスでは、collections.counterを使用します。特定の部分文字列のインスタンスを見つけるには、正規表現またはstr.count()メソッドを使用します。私はテストしていませんが、すべての文字を数え、ディクショナリに追加するときに、単一の部分文字列の数を数えるのではなく、わずかなオーバーヘッドのためにパフォーマンスの違いがあるかもしれません。検索する非常に長いファイルを生成し、各メソッドの実行のタイミングを計るスクリプトを書くことをお勧めします。
ダニエルB.

5
頻繁に使用する場合の利点は、Counterがすべてのカウントを1回計算することです。これは、mystring.count( 'a')を1回実行するのとほぼ同じ速さです。したがって、これを20回行うと、計算時間をおそらく10倍節約できます。カウンタは、アイテムが文字列内にあるかどうかを通知することもできます。たとえば、カウンタの「a」の場合:
BAMF4bacon

51

正規表現かな?

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

30
素晴らしいアイデアですが、この場合はやりすぎです。文字列メソッド 'count'は同じことを行いますが、何をしているのかすぐにわかるというボーナスがあります。
nilamo 2009

18
なぜマイナスのレートなのか、誰かがこのようなコードを似たようなものに必要とするかもしれません。私の投票
kiltek 2012年

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

したがって、文字列内のすべての文字の出現回数を返し、0存在しない場合は、dictを使用します。

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

大文字と小文字を区別しないカウンターの場合は、サブクラス化によってミューテーターメソッドとアクセサーメソッドをオーバーライドできます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「sが__missing__されてCで書かれました。このような単純なタスク(intCでも実装されています)の場合、このアプローチは少し高速です。
ヌーノ・アンドレ

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、組み込み型ではなくなります。また、14 bを14回カウントしています。で変更for c in textするだけで回避できfor 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))

正規表現バージョンの実行には約10倍の時間がかかることに注意してください。これは、my_stringが非常に長い場合、またはコードがディープループ内にある場合にのみ問題になる可能性があります。


1
大文字と小文字の区別を修正するだけの場合、正規表現はやりすぎです。my_sting.lower()。count( 'm')の方がパフォーマンスが高く、明確で、簡潔です。
Ogre Codes

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

また、これには、文が上記と同じ文字を含む部分文字列のリストである場合、もう1つの利点があります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

「カウントを使用せずに文字列内の文字を検索する」メソッド。

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 2017

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

これを実現するには、次の2つの方法があります。

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)

-2

このIMHOにすぎません-上位または下位のメソッドを追加できます

def count_letter_in_str(string,letter):
    return string.count(letter)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.