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

Pythonでリストから目標値以上となる最初の値を見つける方法

数値のリスト rooms と目標値 t が与えられたとします。このとき、rooms の中で t 以上となる最初の値を見つける必要があります。該当する値が存在しない場合は -1 を返します。

例えば、入力が rooms = [20, 15, 35, 55, 30]t = 30 の場合、出力は 35 になります。これは、リストを先頭から順に確認したときに、初めて 30 以上となる値が 35 だからです。それ以前の要素(20 や 15)は目標値 30 を満たしていません。

解決のアプローチ

この問題は、以下の手順で解くことができます。

  • rooms 内の各要素 room を先頭から順に調べる
  • room >= t を満たしていれば、その room を返す
  • ループが終了しても見つからなければ、-1 を返す

実装例

理解を深めるために、次の実装例を見てみましょう。

def solve(rooms, t):
   for room in rooms:
      if room >= t:
         return room
   return -1

rooms = [20, 15, 35, 55, 30]
t = 30
print(solve(rooms, t))

入力

[20, 15, 35, 55, 30], 30

出力

35

計算量について

このアルゴリズムはリストを一度だけ走査する線形探索であるため、時間計算量は O(n)、空間計算量は O(1) となります(n はリストの要素数)。リストがソートされていなくても正しく動作する点が特徴です。

別の書き方:next() を使った簡潔な実装

ジェネレータ式と組み込み関数 next() を組み合わせると、同じ処理をより簡潔に記述できます。

def solve(rooms, t):
    return next((room for room in rooms if room >= t), -1)

第2引数の -1 は、条件を満たす要素がひとつも存在しなかった場合に返されるデフォルト値です。状況に応じて、可読性の高い for ループ版と、簡潔な next() 版を使い分けるとよいでしょう。

  1. Pythonで最初のノードから最後のノードまでの制限付きパスの数を求めるプログラム

    無向の重み付き連結グラフがあるとします。グラフは n 個のノードを持ち、それぞれのノードには 1 から n までのラベルが付けられています。始点から終点へのパスとは [z0, z1, z2, ..., zk] のようなノードの列のことで、z0 が始点ノード、zk が終点ノードであり、隣り合うノード zi と zi+1 の間(0 ≤ i ≤ k-1)には必ず辺が存在します。パスの距離は、そのパスが通る辺の重みの総和として定義されます。また、dist(x) は「ノード n からノード x までの最短距離」を表すものとします。制限付きパス(restricted path)とは、すべての i(0 ≤

  2. Pythonでリストの累積和(累積合計)を求める方法

    この記事では、リストの累積和(累積合計)を求める問題の解決策について詳しく解説します。問題文あるリストが与えられたとき、各要素までの累積和を格納した新しいリストを作成する必要があります。例えば、[10, 20, 30, 40, 50] というリストが与えられた場合、出力は [10, 30, 60, 100, 150] となります。これは、各位置でそれ以前の要素をすべて足し合わせた値です。実装例それでは、実際の実装を見ていきましょう。# 累積和を求める関数 def Cumulative(l): new = [] cumsum = 0 for element in l: