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