Pythonでリスト内の「出現回数と値が一致する要素」を検索する方法
数値のリスト nums が与えられたとき、「リスト内での出現回数(頻度)が、その要素自身の値と一致する要素」が存在するかどうかを判定する問題を考えてみましょう。
たとえば、入力が [2, 4, 8, 10, 4, 4, 4] の場合を考えてみます。このリストでは 4 がちょうど4回出現しているため、条件を満たす要素が存在し、出力は True になります。
解決のアプローチ
この問題は、以下の手順で解くことができます。
- まず、各値の出現回数を記録するための辞書(マップ)
resを作成します。 - 次に、
res内の各キーと値のペア(k, v)を順番に確認します。 - キー
k(要素の値)と値v(出現回数)が一致していたら、Trueを返します。 - 最後まで一致するペアが見つからなければ、
Falseを返します。
それでは、実際の実装例を見てみましょう。
実装例(Pythonコード)
class Solution:
def solve(self, nums):
res = {}
for i in nums:
try:
res[i] += 1
except:
res[i] = 1
for k, v in res.items():
if k == v:
return True
return False
ob = Solution()
print(ob.solve([2, 4, 8, 10, 4, 4, 4]))
入力
[2, 4, 8, 10, 4, 4, 4]
出力
True
コードの解説
このコードでは、まず空の辞書 res を用意し、リスト内の各要素について出現回数をカウントしています。try-except 構文を使うことで、まだ辞書に存在しないキーの場合は初期値 1 を設定し、既に存在する場合はカウントを +1 しています。
カウントが完了したら、res.items() で各ペアを取り出し、キー(要素の値)と値(出現回数)が一致するかどうかを判定します。
別の書き方: collections.Counter を使う方法
Pythonの標準ライブラリ collections.Counter を使えば、出現回数のカウント処理をより簡潔に記述できます。
from collections import Counter
def solve(nums):
counts = Counter(nums)
return any(k == v for k, v in counts.items())
print(solve([2, 4, 8, 10, 4, 4, 4])) # True
any() 関数とジェネレータ式を組み合わせることで、条件を満たす要素が1つでもあれば即座に True を返す、効率的で読みやすいコードになります。
計算量
どちらの実装でも、時間計算量は O(n)(n はリストの長さ)、空間計算量も O(n) となります。リストを一度走査してカウントし、再度辞書の内容を確認するだけなので、大規模なデータに対しても効率的に動作します。
-
【Python】リストから最大値・最小値・2番目に大きい値・2番目に小さい値を求める方法
この記事では、Pythonを使ってリスト(配列)の中から最大値、最小値、2番目に大きい値(second largest)、2番目に小さい値(second smallest)を一度に見つけるプログラムを解説します。ソートを行わずに1回のループで処理できるのがポイントです。アルゴリズム全体の流れは以下の3ステップです。ステップ1:リストの要素を入力する ステップ2:各要素を取り出し、リスト内の他の数値と順に比較する ステップ3:最大値・最小値・2番目に大きい値・2番目に小さい値を取得して表示するサンプルコード# リスト内の最大値・最小値・2番目に大きい値・2番目に小さい値を求める def maxm
-
Pythonでリスト内の最大値・最小値の位置を見つける方法
Pythonでは、リスト内の最大値や最小値を求めるのが非常に簡単で、それらの位置(インデックス)も簡単に取得できます。Pythonには便利な組み込み関数が用意されており、min()はリスト内の最小値を求め、max()はリスト内の最大値を求めます。さらに、index()を使えば特定の要素のインデックス(位置)を調べることができます。 アルゴリズム maxminposition(A, n) /* Aはユーザーが入力したリスト、nはリストのサイズ */ ステップ1:組み込み関数を使って最小要素の位置を求める A.index(min(A)) ステップ2:組み込み関数を使って最