・IT/Web系エンジニアの経験者の方
・どこの転職エージェントを利用しようか迷っている方
それなら、キッカケエージェントにご相談!
キッカケエージェントでは、少数精鋭のエージェントが、エンジニアの経験やスキル、志向性などをカウンセリングし、的確なアドバイスを提供します!
また、徹底した企業へのヒアリングにより、最適なマッチングを実現し、今では内定率が一般的なエージェントの2倍以上となっています!
転職エージェントに迷っている方、まずは無料でキャリア相談から!
(この記事は2024年04月13日に投稿されました。)
Pythonでリスト(List)の各要素の格納数をカウントするにはCounter使用します。
Counterとは、オブジェクト内の各値の数をカウントするcollectionsモジュールのクラスになります。
そのため、リスト(List)に対して使用すると各要素の格納数をカウントし、「要素:個数」のペアとなる辞書型で返ってきます。
また、 多次元リストに対しても使用できますが、カウントしたいリストの範囲によって方法が異なるため注意してください。
今回はPythonのCounterでリスト(List)の各要素の格納数をカウントする方法について紹介していきます。
リスト(List)の各要素の出現回数を調べたい場合
Counterとは
Counterとは、オブジェクトの各値の出現回数をカウントするcollectionsモジュールのクラスになります。
そのため、リスト(List)に対して使用するとリストに格納されている要素の出現回数をカウントします。
Counterの書き方
Counterの書き方は下記のようになります。
1 2 3 | import collections collections.Counter(対象のリスト(List)) |
まず、importでcollectionsクラスをインポートします。
そして、collections.Counter()の括弧にパラメータを1つ追記します。
Counterのパラメータ
Counterのパラメータは下記のようになります。
- 対象のリスト(List):必須
要素の出現回数をカウントする一次元リスト(List)を指定する。
Counter()は必須なパラメータとして「対象のリスト(List)」を指定します。
Counterの返り値
Counterの返り値は「要素名: 要素数」の辞書型(dict)となります。
Counterでリスト(List)の各要素の格納数をカウントするサンプルコード
Counterでリスト(List)の各要素の格納数をカウントするサンプルコードをご紹介します。
ここでは下記の2パターンでCounterを使用します。
- リスト(List)に要素が存在する場合
- リスト(List)に要素が存在しない場合
リスト(List)に要素が存在する場合
リスト(List)に要素が存在する場合にCounterを使用すると、リスト内の各要素の出現回数をカウントします。
● main.py
1 2 3 4 5 6 7 8 9 | import collections print('● 対象のリスト') list1 = ['JavaScript', 'PHP', 'Python', 'C#', 'Java'] print(list1) print("● Counter()使用後") list1_counter = collections.Counter(list1) print(list1_counter) |
実行結果
Counterでリスト(List)の各要素の格納数をカウントしています。
そのため、下記のように表示されています。
- {‘JavaScript’: 1, ‘PHP’: 1, ‘Python’: 1, ‘C#’: 1, ‘Java’: 1}
リスト(List)に要素が存在しない場合
リスト(List)に要素が存在しない場合にCounterを使用すると、空を返します。
● main.py
1 2 3 4 5 6 7 8 9 | import collections print('● 対象のリスト') list1 = ['JavaScript', 'PHP', 'Python', 'C#', 'Java'] print(list1) print("● Counter()使用後") list1_counter = collections.Counter(list1) print(list1_counter) |
実行結果
Counterでリスト(List)の各要素の格納数をカウントしています。
今回はリストに要素が存在しないため、「Counter()」が表示されています。
型の異なる同じ要素を持つリスト(List)に対してCounterを使用する場合
型の異なる同じ要素を持つリスト(List)に対してCounterを使用すると、それぞれ違う要素としてカウントするようになります。
● main.py
1 2 3 4 5 6 7 8 9 | import collections print('● 対象のリスト') list1 = ['10', '20', '30', '40', '50', 10, 20, 30, 40, 50] print(list1) print("● Counter()使用後") list1_counter = collections.Counter(list1) print(list1_counter) |
実行結果
Counterで型の異なる同じ要素を持つリスト(List)の各要素をカウントしています。
そのため、下記のように表示されています。
- {’10’: 1, ’20’: 1, ’30’: 1, ’40’: 1, ’50’: 1, 10: 1, 20: 1, 30: 1, 40: 1, 50: 1}
Counterで多次元リスト(List)の各要素の格納数をカウントするサンプルコード
Counterで多次元リスト(List)の各要素の格納数をカウントするサンプルコードをご紹介します。
多次元リストに対して使用する場合は、アクセスする次元が異なるためカウントしたい箇所によって処理内容が異なります。
そのためここでは、多次元リストに対してCounterを下記の3つの場合で使用します。
- 指定したリスト(List)の要素をカウントする場合
- 各リスト(List)の要素をカウントする場合
- リスト(List)全体の要素をカウントする場合
指定したリスト(List)の要素をカウントする場合
指定したリスト(List)の要素をカウントする場合はリスト変数の後ろにインデックスを指定します。
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import collections print('● 対象の2次元リスト') list1 = [ ['JavaScript', 'C#','Python', 'Swift'], ['Ruby', 'Python', 'Java', 'C'], ['C++', 'Pyhton','Kotlin', 'JavaScript'] ] print(list1) print("● Counter()使用後-1") list1_counter = collections.Counter(list1[2]) print(list1_counter) print('● 対象の3次元リスト') list2 = [ [['JavaScript', 'C#'],['Python', 'Swift']], [['Ruby', 'Python'], ['Java', 'C']], [['C++', 'Pyhton'], ['Kotlin', 'JavaScript']] ] print(list2) print("● Counter()使用後-2") list2_counter = collections.Counter(list2[2][1]) print(list2_counter) |
実行結果
Counterで指定したリスト(List)の要素をカウントしています。
今回は指定したリスト(List)の要素を対象としたため、下記のように表示されています。
- {‘C++’: 1, ‘Pyhton’: 1, ‘Kotlin’: 1, ‘JavaScript’: 1}
- {‘Kotlin’: 1, ‘JavaScript’: 1}
各リスト(List)の要素をカウントする場合
各リスト(List)の要素をカウントする場合は繰り返し処理を使用します。
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import collections print('● 対象の2次元リスト') list1 = [ ['JavaScript', 'C#','Python', 'Swift'], ['Ruby', 'Python', 'Java', 'C'], ['C++', 'Pyhton','Kotlin', 'JavaScript'] ] print(list1) print("● Counter()使用後-1") for list1_m in list1: list1_counter = collections.Counter(list1_m) print(list1_counter) print('● 対象の3次元リスト') list2 = [ [['JavaScript', 'C#'],['Python', 'Swift']], [['Ruby', 'Python'], ['Java', 'C']], [['C++', 'Pyhton'], ['Kotlin', 'JavaScript']] ] print(list2) print("● Counter()使用後-2") for list2_m in list2: for list2_mn in list2_m: list2_counter = collections.Counter(list2_mn) print(list2_counter) |
実行結果
Counterで各リスト(List)の要素をカウントしています。
今回は各リスト(List)の要素を対象としたため、下記のように表示されています。
- {‘JavaScript’: 1, ‘C#’: 1, ‘Python’: 1, ‘Swift’: 1}
- {‘Ruby’: 1, ‘Python’: 1, ‘Java’: 1, ‘C’: 1}
- {‘C++’: 1, ‘Pyhton’: 1, ‘Kotlin’: 1, ‘JavaScript’: 1}
- {‘JavaScript’: 1, ‘C#’: 1}
- {‘Python’: 1, ‘Swift’: 1}
- {‘Ruby’: 1, ‘Python’: 1}
- {‘Java’: 1, ‘C’: 1}
- {‘C++’: 1, ‘Pyhton’: 1}
- {‘Kotlin’: 1, ‘JavaScript’: 1}
リスト(List)全体の要素をカウントする場合
リスト(List)全体の要素をカウントする場合は、多次元リストを単次元リストに一度変換(フラット化)します。
フラットにすることで各リストに格納されている要素が横一列となり、そのリストに対してCounter()を使用することで、全体に格納された要素をカウントすることができます。
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import collections import itertools print('● 対象の2次元リスト') list1 = [ ['JavaScript', 'C#','Python', 'Swift'], ['Ruby', 'Python', 'Java', 'C'], ['C++', 'Pyhton', 'Kotlin', 'JavaScript'] ] print(list1) print("● Counter()使用後-1") list1_flat = itertools.chain.from_iterable(list1) list1_counter = collections.Counter(list1_flat) print(list1_counter) print('● 対象の3次元リスト') list2 = [ [['JavaScript', 'C#'],['Python', 'Swift']], [['Ruby', 'Python'], ['Java', 'C']], [['C++', 'Pyhton'], ['Kotlin', 'JavaScript']] ] print(list2) print("● Counter()使用後-2") list2_flat_M = itertools.chain.from_iterable(list2) list2_flat = list(itertools.chain.from_iterable(list2_flat_M)) list2_counter = collections.Counter(list2_flat) print(list2_counter) |
実行結果
Counterでリスト(List)全体の要素をカウントしています。
今回はリスト(List)全体の要素を対象としたため、下記のように表示されています。
- {‘JavaScript’: 2, ‘Python’: 2, ‘C#’: 1, ‘Swift’: 1, ‘Ruby’: 1, ‘Java’: 1, ‘C’: 1, ‘C++’: 1, ‘Pyhton’: 1, ‘Kotlin’: 1}
- {‘JavaScript’: 2, ‘Python’: 2, ‘C#’: 1, ‘Swift’: 1, ‘Ruby’: 1, ‘Java’: 1, ‘C’: 1, ‘C++’: 1, ‘Pyhton’: 1, ‘Kotlin’: 1}
Counterを使用した実際のケース
Counterを使用した実際のケースについてご紹介します。
例えば、Counterで登録されたユーザーとそのアカウント数の一覧を表示するようなコードを作成します。
● index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <!DOCTYPE html> <html lang="ja"> <head> <title>Counter()でリスト(List)の各要素の格納数をカウント</title> <meta charset="utf-8"/> </head> <body> <h1>登録者とアカウント数の一覧</h1> <table border="1"> <thead> <tr> <th scope="col">名前</th> <th scope="col">電話番号</th> <th scope="col">登録アカウント数</th> </tr> </thead> <tbody> {% for user, cnt in userList.items(): %} <tr> <th scope="row">{{ user[0] }}</th> <td>{{ user[1] }}</td> <td>{{ cnt }}</td> </tr> {% endfor %} </tbody> </table> </body> </html> |
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | from flask import Flask, render_template, request import collections import sqlite3 app = Flask(__name__) @app.route('/') def index(): try: dbname = '***.db' connect = sqlite3.connect(dbname) cur = connect.cursor() cur.execute('SELECT name, phone FROM usrTBL;') usrPhone = cur.fetchall() usr_counter = collections.Counter(usrPhone) print(usr_counter) except Exception as e: print(e) finally: return render_template('index.html', userList = usr_counter) if __name__ == '__main__': app.run() |
実行結果
Counter()で登録されたユーザーとそのアカウント数の一覧を表示しています。
今回は下記のような処理を行っています。
- 登録しているDB(SQLite)から「名前」と「携帯電話」を取り出す。
- 取り出したリストに対してCounter()で集計。
- 集計した結果を画面に表示。
そのため、DBに登録されているユーザー名とデータを集計して画面に表示されています。
Counterでリスト(List)以外の各要素の格納数をカウントする場合
Counterでリスト(List)以外の各要素の格納数をカウントします。
タプル(tuple)の場合
Counterをタプル(tuple)に対して使用します。
● main.py
1 2 3 4 5 6 7 8 9 | import collections print('● 対象のタプル') tuple1 = ('JavaScript', 'PHP', 'Python', 'C#', 'Java', 'PHP', 'PHP') print(tuple1) print("● Counter()使用後-1") tuple1_counter = collections.Counter(tuple1) print(tuple1_counter) |
実行結果
Counter()でタプル(tuple)の各要素の格納数をカウントしています。
そのため、下記のように表示されています。
- {‘PHP’: 3, ‘JavaScript’: 1, ‘Python’: 1, ‘C#’: 1, ‘Java’: 1}
辞書(dict)の場合
Counterを辞書型(dict)型に使用します。
結論を言うと、Counterは直接、辞書型に使用できません。
しかし、item()やkeys()、values()でペアやキー、値を取り出したイテラルに対して使用することができます。
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import collections print('● 対象の辞書') dict1 = {'JavaScript':'ジャバスクリプト', 'PHP':'ピーエイチピー', 'Python': 'パイソン','Java': 'ジャバ'} print(dict1) print("● Counter()使用後-1") doct1_item = dict1.items() dict1_counter1 = collections.Counter(doct1_item) print(dict1_counter1) print("● Counter()使用後-2") doct1_key = dict1.keys() dict1_counter2 = collections.Counter(doct1_key) print(dict1_counter2) print("● Counter()使用後-3") doct1_value = dict1.values() dict1_counter3 = collections.Counter(doct1_value) print(dict1_counter3) |
実行結果
Counterで辞書(dict)型の各要素の格納数をカウントしています。
そのため、下記のように表示されています。
- {(‘JavaScript’, ‘ジャバスクリプト’): 1, (‘PHP’, ‘ピーエイチピー’): 1, (‘Python’, ‘パイソン’): 1, (‘Java’, ‘ジャバ’): 1}
- {‘JavaScript’: 1, ‘PHP’: 1, ‘Python’: 1, ‘Java’: 1}
- {‘ジャバスクリプト’: 1, ‘ピーエイチピー’: 1, ‘パイソン’: 1, ‘ジャバ’: 1}
set(集合)型の場合
Counterをset(集合)型に使用します。
1 2 3 4 5 6 7 8 9 | import collections print('● 対象のset') set1 = set(['JavaScript', 'PHP', 'Python', 'C#', 'Java']) print(set1) print("● Counter()使用後") set1_counter = collections.Counter(set1) print(set1_counter) |
実行結果
CounterでSet(集合)型の各要素の格納数をカウントしています。
そのため、下記のように表示されています。
- {‘JavaScript’: 1, ‘Java’: 1, ‘Python’: 1, ‘PHP’: 1, ‘C#’: 1}
frozenset(不変な集合)型の場合
Counterをfrozenset(不変な集合)型に使用します。
1 2 3 4 5 6 7 8 9 | import collections print('● 対象のfrozenset') fset1 = frozenset(['JavaScript', 'PHP', 'Python', 'C#', 'Java']) print(fset1) print("● Counter()使用後") fset1_counter = collections.Counter(fset1) print(fset1_counter) |
実行結果
Counterでfrozenet(不変な集合)型の各要素の格納数をカウントしています。
そのため、下記のように表示されています。
- {‘PHP’: 1, ‘Python’: 1, ‘JavaScript’: 1, ‘Java’: 1, ‘C#’: 1}
range()オブジェクトの場合
Counterをrange()オブジェクトに使用します。
1 2 3 4 5 6 7 8 9 | import collections print('● 対象のrange()オブジェクト') list1 = range(0,10) print(list1) print("● Counter()使用後") list1_counter = collections.Counter(list1) print(list1_counter) |
実行結果
range()オブジェクトの各要素の格納数をCounterでカウントしています。
そのため、下記のように表示されています。
- {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1}
文字列の場合
Counterを文字列に使用します。
Counterを文字列に対して使用した場合、一文字単位でカウントするようになります。
1 2 3 4 5 6 7 8 9 | import collections print('● 対象の文字列') text1 = 'JavaScript' print(text1) print("● Counter()使用後") text1_counter = collections.Counter(text1) print(text1_counter) |
実行結果
文字列の各文字の出現数をCounterでカウントしています。
そのため、下記のような結果が表示されています。
- {‘a’: 2, ‘J’: 1, ‘v’: 1, ‘S’: 1, ‘c’: 1, ‘r’: 1, ‘i’: 1, ‘p’: 1, ‘t’: 1}
リスト(List)から特定の要素の出現回数を取得する場合
リスト(List)から特定の要素の出現回数を取得するにはcount()を使用します。
count()とは、オブジェクトから指定した値の出現数をカウントする関数になります。
そのため、リストに対して使用することで特定要素の格納数をカウントすることができます。
1 2 3 4 5 6 7 | print('● 対象のリスト') list1 = ['JavaScript', 'PHP', 'Python', 'PHP', 'Java'] print(list1) print("● count()使用後") list1_cnt = list1.count('PHP') print('PHP: ' + str(list1_cnt)) |
実行結果
count()でリスト(List)から特定の要素の出現回数を取得しています。
今回はPHPを指定したため、PHPの格納数である「2」が表示されています。
もし、count()で指定した要素の格納数を取得する内容ついて詳しく知りたい場合は下記の記事をご参考ください。
まとめ
● Counterとはオブジェクトの各値の出現数をカウントするクラスである。
● Counterを使用するには下記のパラメータを指定する。
・対象のリスト(必須)
● リスト(List)に要素が存在する場合にCounterを使用すると、リスト内の各要素の出現回数をカウントする。
● リスト(List)に要素が存在しない場合にCounter(使用すると、「Counter()」を返す。
● 型の異なる同じ要素を持つリスト(List)に対してCounterを使用すると、それぞれ違う要素としてカウントする。
● 多次元リストで指定したリストの要素をカウントする場合はリスト変数の後ろにインデックスを指定する。
● 多次元リストで各リストの要素をカウントするには繰り返し処理を使用する。
● 多次元リストでリスト全体の要素をカウントする場合は、多次元リストを単次元リストに一度変換(フラット化)する。
● Counterは下記のリスト(List)以外の各要素の格納数をカウントすることができる。
・タプル
(タプルの各要素の格納数をカウント)
・辞書(dict)型
(辞書の各ペアやキー、値の格納数をカウント)
・set(集合)型
(集合の各要素の格納数をカウント)
・frozenst(不変な集合)型
(不変な集合の各要素の格納数をカウント)
・range()オブジェクト
(range()オブジェクトの各要素の格納数をカウント)
・文字列
(文字列の各文字の出現数をカウント)
● リスト(List)から特定の要素の出現回数を取得するにはcount()を使用する。