はじめに
ここでは、python の collections を用いて、複雑なリストでも簡単に数え上げる方法を紹介します。
ソースコードと簡単な説明
簡単な例として、people として Aさん、Bさん、Cさん、の3名がいて、1 ~ 5 までの成績がついているようなリストがあったとします。それぞれの数は決まってません。このような情報を整理して、各人がどういう成績を何回取得したかをまとめる方法を紹介します。
# Counterは、要素の出現回数をカウントするための特別な辞書のようなデータ構造です。
from collections import Counter
# peopleというリストには、A、B、Cなどの文字が順番に格納されています。
people = ["A", "A", "A", "B", "B", "B", "B", "A", "A", "A", "A", "A", "C", "C", "C"]
# gradeというリストには、各人の成績が順番に格納されています。
grade = [ 1, 3, 2, 3, 4, 2, 2, 3, 4, 4, 3, 3, 3, 4, 5]
# peopleリストの各要素の出現回数をカウントします。
counter_people = Counter(people)
# 人々の出現回数を表示します。
print("[check people]")
# most_common()は、最も多い要素から順に表示するメソッドです。
for _ in counter_people.most_common():
print(_)
# peopleとgradeのリストを組み合わせて、ペアのリストを作成します。
pairs = list(zip(people, grade))
# 各ペア(人と成績の組み合わせ)の出現回数をカウントします。
counter_people_grade = Counter(pairs)
# 人と成績のペアの出現回数を表示します。
print("[check people & grade]")
for _ in counter_people_grade.most_common():
print(_)
これを実行すると、
[check people]
('A', 8)
('B', 4)
('C', 3)
[check people & grade]
(('A', 3), 4)
(('B', 2), 2)
(('A', 4), 2)
(('A', 1), 1)
(('A', 2), 1)
(('B', 3), 1)
(('B', 4), 1)
(('C', 3), 1)
(('C', 4), 1)
(('C', 5), 1)
このような結果が得られます。
_ は、通常、特定の値を無視したいときや、変数名が重要でない場面で使われる慣習的な変数名で、ここでは、改行後にプリントする例を紹介するためだけに使ってます。
ポイント
使い所のポイントとしては、
# peopleとgradeのリストを組み合わせて、ペアのリストを作成します。
pairs = list(zip(people, grade))
# 各ペア(人と成績の組み合わせ)の出現回数をカウントします。
counter_people_grade = Counter(pairs)
の部分で、list(zip(x,y))) で、ペアのリストを作成してから、Counter を実行することで、2つのリストを包含した格好で、頻度分布を作成してくれます。