PythonのLambda式とreduce関数で奇数回出現する数値を見つける方法
はじめに
本記事では、ユーザーが入力した正の整数の配列(リスト)の中から、奇数回出現する数値を見つける方法を解説します。PythonのLambda式とfunctools.reduce関数、そしてXOR演算を組み合わせることで、この問題を非常にシンプルなコードで解決できます。
実行例
入力 : A = [2, 4, 7, 7, 4, 2, 2] 出力 : 2
この例では、2 だけが3回(奇数回)出現しているため、結果として 2 が出力されます。
アルゴリズムの仕組み
この手法の鍵となるのは、XOR(排他的論理和 ^)演算が持つ以下の性質です。
- 同じ数同士のXORは
0になる(例:4 ^ 4 = 0) 0と任意の数のXORは、その数自身になる(例:0 ^ 7 = 7)
したがって、リスト内のすべての要素を順番にXORで畳み込んでいくと、偶数回出現する数値は互いに打ち消し合って消え、奇数回出現する数値だけが最後に残るという仕組みです。
処理の手順
- 配列(リスト)のサイズと要素を入力する
- Lambda式
lambda a, b: a ^ bを定義する reduce関数を使って、リスト全体を単一の値になるまで畳み込む- 各ステップで
a ^ bの計算が行われ、結果が次のaに渡される - 初期値を指定しない場合、
aはリストの先頭要素から始まり、bには2番目以降の要素が順番に代入される
サンプルコード
# 奇数回出現する数値を見つけるPythonプログラム
# Lambda式とreduce関数を使用
from functools import reduce
def timeoccurrance(inp):
print("RESULT ::>", reduce(lambda a, b: a ^ b, inp))
# ドライバープログラム
if __name__ == "__main__":
A = list()
n1 = int(input("Enter the size of the List ::"))
print("Enter the Element of List ::")
for i in range(n1):
k = int(input())
A.append(k)
timeoccurrance(A)
実行結果
Enter the size of the List :: 7 Enter the Element of List :: 1 2 3 2 3 1 3 RESULT ::> 3
この例では、1 と 2 はそれぞれ2回(偶数回)出現するためXOR演算で打ち消され、3回(奇数回)出現している 3 のみが結果として出力されます。
まとめ
Lambda式とreduce関数を組み合わせれば、ループや辞書(カウンター)を使わずに1行でこの問題を解決できます。計算量は O(n)、追加メモリもほぼ不要(O(1))のため、パフォーマンス面でも非常に優れたアプローチです。ビット演算の特性を活かしたテクニックとして、競技プログラミングやコーディング面接でも頻出の話題なので、ぜひ覚えておきましょう。
-
Pythonでリスト内の最小値を見つける方法を解説
この記事では、リストの中から最小の数値を見つける方法について、具体的なサンプルコードとともに詳しく解説します。問題の概要問題: 数値のリストが与えられたとき、その中に含まれる最も小さい数値を画面に表示すること。この問題を解くアプローチは主に2つあります。ひとつは sort() メソッドを使ってリストを昇順に並べ替え、先頭の要素(インデックス0)を取得する方法。もうひとつは、Pythonに標準で用意されている組み込み関数 min() を使う方法です。それぞれ順番に見ていきましょう。方法1:sort()メソッドで並べ替えて最小値を取得するまずはリストを昇順にソートし、先頭の要素を取り出す方法です。
-
Pythonのmap関数を使って「1」が最も多い行を見つけるプログラム
0と1だけで構成された2次元配列(行列)が与えられ、すべての行はあらかじめソートされているものとします。この中から「1」の個数が最も多い行を見つけるのが本記事の目的です。ここでは、Pythonの組み込み関数である map() を活用します。 map() 関数は、関数型プログラミングに用いられるPython組み込みツールの中でも最もシンプルなものの一つです。シーケンスやその他のイテラブル(反復可能オブジェクト)に対して、指定した関数を一括して適用することができます。 実行例 入力 : 入力配列 : [[0, 1, 1, 1, 1], [0, 0, 1, 1, 1], [1, 1, 1, 1, 1