Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで2次元リスト内の最頻出要素を検索する3つの方法

2次元リストとは、リストを要素として持つリスト、すなわち「リストのリスト」のことです。本記事では、ネストされた複数のサブリストの中から、最も多く出現する要素(最頻出要素)を見つける方法を、3つの異なるアプローチで解説します。

max関数とcountメソッドを使う方法

まず、リスト内包表記を使ってすべてのサブリストの要素を1つのフラットなリストにまとめます。その後、max関数のkey引数にcountメソッドを指定することで、出現回数が最大となる要素を取得できます。

コード例

def highest_freq(lst):
    SimpleList = [el for sublist in lst for el in sublist]
    return max(SimpleList, key=SimpleList.count)

# 対象のリスト
listA = [[45, 20, 11], [20, 17, 45], [20, 13, 9]]
print("Given List:\n", listA)
print("Element with highest frequency:\n", highest_freq(listA))

実行結果

Given List:
[[45, 20, 11], [20, 17, 45], [20, 13, 9]]
Element with highest frequency:
20

この例では、値 20 が3つのサブリストすべてに含まれており、合計3回出現するため、最頻出要素として返されます。

itertools.chainを使う方法

基本的なアプローチは上記と同じですが、リストの平坦化にitertoolsモジュールのchain関数を使用します。chain.from_iterableは、ネストされたイテラブルを効率的に1つのシーケンスへ連結できるため、大規模なデータでも扱いやすくなります。

コード例

from itertools import chain

def highest_freq(lst):
    SimpleList = list(chain.from_iterable(lst))
    return max(SimpleList, key=SimpleList.count)

# 対象のリスト
listA = [[45, 20, 11], [20, 17, 45], [20, 13, 9]]
print("Given List:\n", listA)
print("Element with highest frequency:\n", highest_freq(listA))

実行結果

Given List:
[[45, 20, 11], [20, 17, 45], [20, 13, 9]]
Element with highest frequency:
20

Counterとchainを組み合わせる方法

この方法では、itertoolsのchain関数で取り出した各要素の出現回数を、collectionsモジュールのCounterクラスが集計します。most_common(1)メソッドを呼び出すと、出現回数が最も多い要素とそのカウントがタプル形式で取得できるため、その先頭の要素を取り出せば目的の値が得られます。

コード例

from itertools import chain
from collections import Counter

def highest_freq(lst):
    SimpleList = chain.from_iterable(lst)
    return Counter(SimpleList).most_common(1)[0][0]

# 対象のリスト
listA = [[45, 20, 11], [20, 17, 45], [20, 13, 9]]
print("Given List:\n", listA)
print("Element with highest frequency:\n", highest_freq(listA))

実行結果

Given List:
[[45, 20, 11], [20, 17, 45], [20, 13, 9]]
Element with highest frequency:
20

まとめ

いずれの方法でも同じ結果が得られますが、それぞれ特徴が異なります。max+countの組み合わせはシンプルで追加のインポートが不要な一方、countは呼び出しごとにリスト全体を走査するため、計算量がO(n²)になります。一方、Counterを使う方法はO(n)で動作するため、要素数が多いデータセットでは最も効率的です。データサイズや可読性の要件に応じて、適切な方法を選択するとよいでしょう。

  1. Pythonでリスト内の最大値・最小値の位置を見つける方法

    Pythonでは、リスト内の最大値や最小値を求めるのが非常に簡単で、それらの位置(インデックス)も簡単に取得できます。Pythonには便利な組み込み関数が用意されており、min()はリスト内の最小値を求め、max()はリスト内の最大値を求めます。さらに、index()を使えば特定の要素のインデックス(位置)を調べることができます。 アルゴリズム maxminposition(A, n) /* Aはユーザーが入力したリスト、nはリストのサイズ */ ステップ1:組み込み関数を使って最小要素の位置を求める A.index(min(A)) ステップ2:組み込み関数を使って最

  2. Pythonでリスト内の要素のインデックスを取得する方法

    index()メソッドで最初の出現位置を取得する リスト(文字列やタプルなど、他のシーケンス型でも同様)に用意されている index() メソッドを使うと、特定の要素が最初に出現する位置(インデックス)を簡単に見つけることができます。 >>> L1=[a, b, c, a, x] >>> L1 [a, b, c, a, x] >>> L1.index(a) 0 この例では、リスト L1 の中で a が最初に出現するのはインデックス 0 の位置であるため、0 が返されます。なお、指定した要素がリスト内に存在しない場合は ValueError