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

Pythonのmap関数で1が最も多い行を検索する方法


このチュートリアルでは、Pythonのmap関数を使って、行列(2次元リスト)の中から「1」の数が最も多い行を見つけるプログラムを作成します。

まず、次のような行列を例に考えてみましょう。

matrix = [
    [0, 0, 1],
    [1, 1, 1],
    [1, 1, 0]
]

プログラムの書き方はさまざまありますが、ここではmap関数を活用し、以下の手順で実装していきます。

  • 行列を初期化する
  • map関数を使って各行に含まれる「1」の個数を求め、リストに格納する
  • リストの中から最大値(およびそのインデックス)を出力する

サンプルコード

## 行列の初期化
matrix = [
    [0, 0, 1],
    [1, 1, 1],
    [1, 1, 0]
]

## 行内の「1」の個数を数える関数
def number_of_ones(row):
    count = 0
    for i in row:
        if i == 1:
            count += 1
    return count

## 各行の「1」の個数を求める
## mapはイテレータを返すため、list()でリストに変換しています
ones_count = list(map(number_of_ones, matrix))

## 「1」の数が最大となる行のインデックスを出力
print(ones_count.index(max(ones_count)))

実行結果

上記のプログラムを実行すると、次の出力が得られます。

1

この結果「1」は、インデックス1(2行目)の [1, 1, 1] に「1」が3つ含まれており、他の行よりも多いことを示しています。

補足:より簡潔な書き方

リストには要素を数える count() メソッドが用意されているため、これをlambda式と組み合わせると、コードをさらに短くできます。

## 各行の「1」の個数をcountメソッドで取得
ones_count = list(map(lambda row: row.count(1), matrix))

## 最大値を持つ行のインデックスを出力
print(ones_count.index(max(ones_count)))

また、max() にkey引数を渡せば、中間リストを作らずに直接インデックスを求めることも可能です。

print(max(range(len(matrix)), key=lambda i: matrix[i].count(1)))

状況に応じて使い分けると、より読みやすく効率的なコードになります。プログラムについてご不明な点があれば、コメント欄でお気軽にお尋ねください。

  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で行列の転置を求めるプログラム

    この記事では、与えられた問題に対する解法とアプローチについて詳しく解説します。 問題文 ある行列が与えられたとき、その転置を同じ行列に格納し、結果を表示する必要があります。 行列の転置とは、行を列に、列を行に入れ替えたものです。言い換えれば、行列Aの転置は、要素A[i][j]をA[j][i]と入れ替えることで得られます。 実装例 N = 4 def transpose(A): for i in range(N): for j in range(i+1, N): A[i][j], A[j][i] = A[j][i], A[i][j] # ドライ