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

Pythonのmap関数を使って1が最も多い行を検索するプログラムの書き方

概要

2次元配列(行列)が与えられ、その要素は0と1のみで構成されています。すべての行はソート済みであるとし、その中から「1」の個数が最も多い行を見つけるのが本記事の目的です。ここではPythonの組み込み関数 map() を活用します。map() は、関数型プログラミングに使われるPython組み込み関数の中で最もシンプルなものの一つで、シーケンスなどのイテラブルに対して指定した関数を適用できる便利なツールです。

実行例

入力:
Array = [[0, 1, 1, 1, 1],
         [0, 0, 1, 1, 1],
         [1, 1, 1, 1, 1],
         [0, 0, 0, 0, 1]]

出力:
1が最も多い行のインデックス = 2

この例では、3行目(インデックス2)に1が5個含まれており最も多いため、結果は「2」となります。

アルゴリズム

  1. map() 関数を使って、行列の各行の合計値を求めます。
  2. 各行の合計値(=1の個数)をまとめたリストを取得します。
  3. リスト内の最大値のインデックスを出力します。

各行は0と1のみで構成されているため、行の合計値を計算するだけで、その行に含まれる1の個数が分かります。ここがこの手法のポイントです。

サンプルコード

# Python program to find the row with maximum number of 1's
def maximumofones(n):
    max1 = list(map(sum, n))
    print("MAXIMUM NUMBER OF 1's ::>", max1.index(max(max1)))

# Driver program
if __name__ == "__main__":
    n = [[0, 1, 1, 1, 1], [0, 0, 1, 1, 1], [1, 1, 1, 1, 1], [0, 0, 0, 0, 1]]
    maximumofones(n)

コードの解説

  • map(sum, n):行列 n の各行(リスト)に sum() を適用し、各行の要素の合計を計算します。
  • list(...):mapオブジェクトをリストに変換し、各行の1の個数一覧を作ります。
  • max(max1):リスト内の最大値(最も多い1の個数)を取得します。
  • max1.index(...):最大値が格納されているインデックス、つまり「1が最も多い行の位置」を返します。

出力

MAXIMUM NUMBER OF 1's ::> 2

補足:別のアプローチ

enumeratemax のkey引数を組み合わせれば、以下のようにより簡潔に書くことも可能です。

rows = [[0, 1, 1, 1, 1], [0, 0, 1, 1, 1], [1, 1, 1, 1, 1], [0, 0, 0, 0, 1]]
result = max(range(len(rows)), key=lambda i: sum(rows[i]))
print(result)  # 2

いずれの方法でも計算量は O(行数 × 列数) となり、小規模な行列であれば十分高速に動作します。また、各行がソート済みであることを利用すれば、二分探索などでさらに効率化することもできます。

  1. Pythonで同じラベルを持つサブツリー内のノード数を求めるプログラム

    ここでは、n個のノードからなる根付きの一般木を考えます。ノードには0からn-1までの番号が振られており、各ノードには小文字の英字ラベルが割り当てられています。ラベルは配列labelsとして与えられ(labels[i]がi番目のノードのラベル)、木は辺リストで表現されます。各辺eは[u, v]という形式で、uが親、vが子であることを意味します。 求めたいのは、サイズnの配列Aです。A[i]には「i番目のノードと同じラベルを持つ、そのサブツリー内のノードの総数」を格納します。 例えば、入力が次のような場合を考えてみましょう。 n = 5、label = ccaca のとき、出力は [3, 2,

  2. Pythonで最大の成功確率を持つパスを見つけるプログラムの実装方法

    問題の概要 n 個のノード(ノードには 0 から順に番号が振られています)からなる無向重み付きグラフを考えます。このグラフは辺リスト(edge list)として入力され、各辺 e には「その辺を通過する際の成功確率」probability[e] が割り当てられています。さらに、開始ノード(start)と終了ノード(end)も与えられます。 求めたいのは、start から end へ移動するときに成功確率が最大となる経路であり、答えとしてその成功確率を返します。経路がひとつも存在しない場合は 0 を返してください。 たとえば、次のような入力が与えられたとします。 この場合の出力は 0.25