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

Pythonで行列(ネストされたリスト)の行の長さごとの出現頻度を数える方法


Pythonでは、行列(リストの中にリストが入ったネスト構造)を扱う際に、「各行の長さがそれぞれ何回現れるか」という出現頻度を集計したいケースがあります。そのような場合は、リストを反復処理しながら、各行の長さをキーとして空の辞書に登録し、同じ長さが再び現れたらカウントを1ずつ増やしていく方法がシンプルで有効です。

サンプルコード

以下に具体的な実装例を示します。

my_list = [[42, 24, 11], [67, 18], [20], [54, 10, 25], [45, 99]]

print("元のリスト :")
print(my_list)

my_result = dict()
for element in my_list:

   if len(element) not in my_result:
      my_result[len(element)] = 1

   else:
      my_result[len(element)] += 1

print("集計結果 :")
print(my_result)

実行結果

元のリスト :
[[42, 24, 11], [67, 18], [20], [54, 10, 25], [45, 99]]
集計結果 :
{1: 1, 2: 2, 3: 2}

コードの解説

  • まず、複数のリストを要素として持つリスト(行列)を定義し、コンソールに表示します。

  • 次に、集計結果を格納するための空の辞書を用意します。

  • リストを反復処理し、各行の長さ(len() の戻り値)が辞書にまだ存在しない場合は、その長さをキーとして値を1に設定します。

  • すでに同じ長さのキーが存在する場合は、対応する値を1つずつ加算していきます。

  • 最終的に、長さごとの出現回数がまとまった辞書がコンソールに出力されます。

この実行結果からは、「長さ1の行が1個、長さ2の行が2個、長さ3の行が2個」存在することが読み取れます。

補足:collections.Counter を使ったより簡潔な方法

標準ライブラリの collections.Counter を使えば、同様の集計をより短いコードで実現できます。

from collections import Counter

my_list = [[42, 24, 11], [67, 18], [20], [54, 10, 25], [45, 99]]
my_result = dict(Counter(len(row) for row in my_list))

print(my_result)  # {3: 2, 2: 2, 1: 1}

状況に応じて、手動で辞書を操作する方法と Counter を活用する方法を使い分けるとよいでしょう。

  1. C言語で行列の要素を斜め下方向に出力するプログラム

    n×nサイズの配列が与えられたとき、その整数型の行列要素を斜め下方向に出力するのが課題です。「斜め下方向」とは、任意のn×nサイズの配列を、下図のように左上から右下へ斜めに移動しながら順番に出力することを意味します。具体的には、まず「1」を出力し、次に「2」を出力した後、斜め下の「4」へ移動して出力します。この操作を行列のすべての要素に対して繰り返していきます。入力例と出力例入力:Matrix [3][3] = {    { 1, 2, 3 },    { 4, 5, 6 },    { 7, 8, 9 }} 出力:1 2 4 3 5

  2. Pythonで行列内の「完全に囲まれた島」の数を数える方法を解説

    問題の概要0と1のみで構成された2次元のバイナリ行列を考えます。ここで「1」は陸地、「0」は水を表します。島とは、隣り合った1の集まりであり、その周囲がすべて水で囲まれている領域のことです。本記事では、行列の中から端(境界)に一切接しておらず、完全に水で囲まれた島の数を数えるプログラムをPythonで実装する方法を解説します。例として、次のような入力が与えられた場合を考えてみましょう。この場合の出力は 2 となります。島は全部で3つ存在しますが、そのうち2つだけが完全に水で囲まれているためです。解法のアプローチ:DFS(深さ優先探索)この問題は、DFS(深さ優先探索)を用いることで効率的に解く