Pythonでリストのリストの各位置における指定文字の出現頻度を求める方法
リストを要素として持つリスト(ネストされたリスト)を扱う場面を考えてみましょう。ここでは、内側のリストの各位置において、特定の文字が何回出現するかを調べる方法を解説します。
例として、次のようなリストのリストを考えます。
listA = [['a', 'a', 'b'], ['a', 'c', 'b'], ['c', 'a', 'b'], ['c', 'a', 'a']]
このリストでは、各要素が3つの要素を持つリストになっています。たとえば最初の内側のリストは、位置0、1、2にそれぞれ「a」「a」「b」が格納されています。同様に3番目のリストは、同じく位置0、1、2に「c」「a」「b」が入っています。すべての内側のリストを通して見ると、「a」は位置0に2回、位置1に3回、位置2に1回出現していることがわかります。
以下では、リストのリスト内の任意の要素について、このような位置ごとの出現回数を求めるプログラムを紹介します。
pandasを使う方法
pandasライブラリは、データフレームを作成してデータ操作を行う際に広く利用されています。ここではまずデータフレームを作成し、where句を組み合わせて処理することで、データフレームの各位置に値「a」が存在するかどうかを確認します。
サンプルコード
import pandas as pd
# 対象となるリストのリスト
listA = [['a', 'a', 'b'],
['a', 'c', 'b'],
['c', 'a', 'b'],
['c', 'a', 'a']]
# pandasを使用
df = pd.DataFrame(listA)
res = df.where(df == 'a', 0).where(df != 'a', 1)
# 結果を出力
print("位置0、1、2における'a'の出現回数\n", res.sum())
実行結果
上記のコードを実行すると、次の結果が得られます。
位置0、1、2における'a'の出現回数 0 2.0 1 3.0 2 1.0
この方法では、「a」と一致するセルを1に、それ以外を0に変換した上で列ごとに合計を計算しているため、結果は小数(float)型で返されます。
zip関数を使う方法
forループでリスト内の各サブリストの各位置を順に処理し、zip関数をリストのリスト全体に適用する方法もあります。zip(*listA)と書くことで各位置ごとの要素がタプルとしてまとめられ、その後count()メソッドで「a」の出現回数を数えることができます。
サンプルコード
# 対象となるリストのリスト
listA = [['a', 'a', 'b'],
['a', 'c', 'b'],
['c', 'a', 'b'],
['c', 'a', 'a']]
res = [elem.count('a') for elem in zip(*listA)]
# 結果を出力
print("位置0、1、2における'a'の出現回数\n", res)
実行結果
上記のコードを実行すると、次の結果が得られます。
位置0、1、2における'a'の出現回数 [2, 3, 1]
zip関数を使う方法は、外部ライブラリに依存せず、リスト内包表記と組み合わせることで簡潔に記述できるのが特徴です。小規模なデータであればこちらの方がシンプルで効率的です。一方、大規模なデータセットを扱う場合や、さらに複雑な集計・分析を行いたい場合は、pandasを活用する方法が適しています。用途に応じて使い分けるとよいでしょう。
-
Pythonで2つのリストの共通要素を求めるプログラム(積集合の計算方法)
リストの共通部分(Intersection/積集合)とは、2つのリストに共通して含まれるすべての要素を取り出し、それらを別の3つ目のリストに格納する操作のことです。 List1::[1,2,3] List2::[2,3,6] List3::[2,3] 上記の例では、List1とList2の両方に存在する「2」と「3」が抽出され、List3に格納されています。 アルゴリズム ステップ1:リストを入力する。 ステップ2:まず1つ目のリストの全要素を走査し、2つ目のリストの各要素と照合する。 ステップ3:要素が一致した場合、その値を3つ目のリストに格納する。 サンプルコード # 2つのリス
-
Pythonでリストの指定した位置にオブジェクトを挿入する方法
Pythonのリストにおいて、指定した位置(インデックス)に要素を挿入したい場合は、insert(pos, obj) メソッドを使用します。このメソッドは挿入したいオブジェクトを1つ引数として受け取り、メソッドを呼び出したリストの pos 番目の位置にそのオブジェクトを追加します。既存の要素は後ろにずらされるため、元のデータが失われることはありません。例my_list = [2, 3, 1, -4, -1, -4] my_list.insert(1, 0) print(my_list)実行結果上記のコードを実行すると、次のような出力が得られます。[2, 0, 3, 1, -4, -1, -4]