Pythonのcountメソッドでlistや文字列を検索する方法

Pythonのcountメソッドは、文字列やリスト、タプルの中に指定の文字列がいくつあるかを数えてくれるメソッドです。よく使うものなので、ここでしっかりと学習しておきましょう。

目次

1. Pythonのcountメソッドの使い方

Pythonのcountメソッドは次のように書きます。

In [ ]:
''' countメソッドの書き方 '''

#  文字列
文字列.count('探したい文字列', 開始位置, 終了位置)

#  リストとタプルに使う場合も同じです。
リストまたはタプル.count('探したい文字列')

こう書くと、該当する文字の個数を返してくれます。もし指定の文字が存在しない場合は0を返します。

なおcountメソッドを文字列に対して使う場合は、オプションで開始位置と終了位置を指定できますが、リストやタプルに対して使う場合は指定できない点が異なりますので覚えておきましょう。

また、辞書、集合に対してはcountメソッドは使えません。

ちなみに、「Pythonのfindメソッド」は指定の文字列の位置を教えてくれます。このcountメソッドで指定の文字列の個数を確認してから、findメソッドで一つずつ位置を確認していくという使い方ができます。

それでは、実際のコードを見ていきましょう。

2. Pythonのcountで文字列を検索

次の文字列に対してcountメソッドを使いたいと思います。

開始位置と終了位置の指定にインデックス番号を使います。インデックス番号は前から数える時は0から始まり、後ろから数える時は-1から始まります。意外と忘れがちなので、覚えておきましょう。

次のコードをご覧ください。

In [1]:
''' 使ってみましょう '''

#  この文字列の中に新聞紙という文字列は存在するでしょうか。
print('新聞紙下から読んでも新聞紙' .count('新聞紙'))

#  開始位置を指定して探してみましょう。
print('新聞紙下から読んでも新聞紙' .count('新聞紙', 0, 5))

#  開始位置と終了位置を指定して探してみましょう。
print('新聞紙下から読んでも新聞紙' .count('新聞紙', -10, -4))
2
1
0

この文字列の中に「新聞紙」という文字は2つありますね。そのためcountメソッドは2と返します。

開始位置と終了位置を指定すると、countメソッドは、その指定区間の中だけで指定の文字の個数を数えてくれます。下図のように、指定の開始位置と終了位置(0から5と-10から-4)の間では、「新聞紙」という文字列の数は1個と0個ですね。

このように開始位置と終了位置の指定は、後ろから数えたインデックス番号も使えることを覚えておくと、非常に長い文字列から指定の文字を検索する時に、より効率的になります。

それでは、もう一つ例を見てみましょう。次は以下の文字列を使います。

ここで見ていきたいのは、

  • countメソッドは記号や空白も数える
  • アルファベットの大文字と小文字は同じ文字とはみなさない
  • 文字列のインデックス番号は空白や記号も1と数える

という点です。それでは次のコードをご覧ください。

In [2]:
''' インデックス番号はスペースや記号も1として数えます。 '''
str = 'Geek for geek, wow!'

#  この文字列の中にgeekという文字列は存在するでしょうか。
print(str.count('geek'))

#  大文字のGeekと小文字のgeekは別の文字としてcountされます。
print(str.count('Geek'))

#  この文字列の中に!という記号は存在するでしょうか。
print(str.count('!'))

#  この文字列の中に空白は存在するでしょうか。
print(str.count(' '))

#  開始位置と終了位置を指定する時は空白も数えましょう。
print(str.count('wow', 0, 15))
1
1
1
3
0

まず、この文字列の中に’geek’という文字列は1つだけです。そして’Geek’という文字列も1個だけです。このようにPythonではアルファベットの大文字小文字は別の文字としてみなされます。

次に、’!’は1個、’ ‘(空白)は3個と返ってきました。countメソッドはこのように記号や空白も数えます。なお、この例にはありませんが、

  • 改行\n
  • タブ\t
  • 垂直タブ\v
  • 復帰\r
  • 改ページ\f

などのコードも数えてくれますので試してみてください。

3. Pythonのcountでlistを検索

Pythonではlistにもcountメソッドがあります。tupleでも使えますが、全く一緒なので、ここではlistの例を見ていきましょう。

文字列のcountメソッドとの最大の違いは、開始位置と終了位置の指定はできないということです。次のコードをご覧ください。

In [1]:
list = [1, 5, 5, 10, 10, 10, 15, 15, 15,  20]

#  リスト内に2は何個ある?
print(list.count(2))

#  リスト内に5は何個ある?
print(list.count(5))

#  リストではオプション引数の開始位置と終了位置は指定できません。
print(list.count(5, 3, 7))
0
2
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-ff604f15ec90> in <module>
      8 
      9 #  開始位置を指定
---> 10 print(list.count(5, 3, 7))

TypeError: count() takes exactly one argument (3 given)

まずリスト内に2は存在しませんので0が返ってきています。次に5は2個ありますので2が返ってきています。

次に、インデックス番号3から7の間に5はあるでしょうか?これを実行するとエラーが返ってきています。「’count() takes exactly one argument’(count()は引数を1つだけ受け取ります)」と書かれていますね。このようにlistのcountメソッドは開始位置と終了位置を指定するとエラーになりますので覚えておきましょう。

参考として、countメソッドを使うと、次のような合否判定プログラムを作ることができます。数値の半数以上が1なら合格、そうでないなら不合格となるプログラムです。

In [1]:
''' listとcountメソッドを使うと判定プログラムを作れます。 '''

#リストを作成します。
result = [1, 1, 0, 0, 1,1, 0, 0, 1, 1]
 
#"half"はリスト"result"の要素の個数の半分です。
half = len(result)/2
 
#1の個数がpointになります。
point = result.count(1)
#pointが半数以上なら合格、それ以外は不合格です。
if point >= half :
    print("合格")
else :
    print("不合格")
合格

なお、Pythonのリストには、様々な検索のメソッドや関数が用意されています。以下をご覧ください。

In [1]:
''' リストを検索する様々な方法 '''
list = [1, 5, 5, 10, 10, 10, 15, 15, 15,  20]

#  in文は存在するならTrue、しないならFalseを返します。
print(5 in list)

#  indexメソッドは要素の位置を返します。
print(list.index(10))

#  collectionsモジュールのCounter関数は要素を辞書型にして表示します。
import collections
print(collections.Counter(list))
True
3
Counter({10: 3, 15: 3, 5: 2, 1: 1, 20: 1})

Pythonのリストを検索する方法まとめ』と『PythonのCounter関数で要素の出現回数を調べる様々な方法』でも解説しているので、併せて確認してみてください。

4. Pythonのcountメソッドのまとめ

Pythonのcountメソッドは、文字列、リスト、タプルで使えるメソッドです。指定の文字に該当する文字があれば、その個数を返してくれます。なお、文字だけでなく、空白や記号、改行コード等の個数も調べることができます。

ただし、文字列のcountメソッドはオプションで開始位置と終了位置を指定することができますが、リストやタプルの場合はできません。ここに違いがあるので、しっかりと覚えておきましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる