-
Pythonでリスト・タプルを線形検索する方法を解説
本記事では、Pythonのリストやタプルに対して線形検索(Linear Search)を実装する方法を、初心者にもわかりやすく解説します。線形検索は最も基本的な検索アルゴリズムの一つです。先頭の要素から順番に目的の要素と照合していき、該当する要素が見つかった時点で検索を終了します。データ量が多くない場合や、データがソートされていない場合に有効な手法です。線形検索の実装手順リストやタプルに線形検索を実装するには、以下の手順に従います。検索対象となるリストまたはタプルと、探したい要素を用意するリストやタプルを順番に走査し、各要素が目的の要素と一致するか確認する要素が見つかった時点でループを抜け、フ
-
Pythonのmath.ldexp()関数の使い方を徹底解説
本記事では、Pythonの標準ライブラリ「math」に含まれるldexp()関数の使い方について詳しく解説します。数値計算を効率的に行いたい場面で役立つ関数なので、ぜひ参考にしてください。 ldexp()関数とは ldexp(first, second)は、正負どちらの有効な数値でも引数として受け取ることができ、first × 2^second(第1引数に、第2引数を指数とする2の累乗を掛けた値)を返します。 それでは、具体的な使用例を見ていきましょう。 使用例 # mathライブラリをインポート import math # ldexp関数を使用 print(math.ldexp(1, 4)
-
Pythonでリスト内の要素が最後に出現するインデックスを取得する方法
この記事では、Pythonのリスト内である要素が最後に出現する位置(インデックス)を取得するための、複数の方法をわかりやすく解説します。まずは、リストを逆順に並べ替えてから要素を検索する方法を見ていきましょう。以下の手順に従ってコードを書いてみます。リストを初期化するreverse() メソッドでリストを逆順にするindex() メソッドで要素のインデックスを取得する元のリストにおける実際のインデックスは「len(リスト) - index - 1」で求められる最終的なインデックスを出力する方法1:リストを逆順にして検索するそれでは、実際のコードを見てみましょう。# リストの初期化 words
-
Pythonで数値リストから作れる最大の数を求める2つの方法
この記事では、与えられた数値のリストを並べ替えて作れる「最大の数」を求める方法を解説します。例えば [45, 35, 138, 43, 67] というリストがあった場合、これらの数字をどのような順序で並べれば最も大きな整数になるのでしょうか。本記事では、全順列を試すシンプルな方法と、ソートを活用した効率的な方法の2つのアプローチを、コード例とともにわかりやすく紹介します。 方法1: itertools.permutationsで全順列を調べる まずは、itertoolsモジュールのpermutationsメソッドを使って、考えられるすべての並び順(順列)を生成し、その中から最大値を探す方法です
-
【Python入門】リスト内の文字列をUnicodeに変換して結合する方法
この記事では、Pythonを使ってリスト内の文字列要素をUnicode(バイト列)に変換し、それらを結合する方法を解説します。初心者の方でも理解しやすいよう、手順を追ってサンプルコードとともに説明していきます。処理の手順以下の手順に従ってコードを書いていきます。結合したい文字列を含むリストを初期化します。map関数とstr.encodeメソッドを使って、リスト内のすべての要素をUnicode(バイト列)に変換します。各バイト列をstr.decodeメソッドでデコードし、通常の文字列に戻します。joinメソッドを使って文字列同士を連結します。最終的な結果を出力します。ポイント:encodeとde
-
Pythonでリスト内の隣接する単語のみを結合する方法
この記事では、Pythonのリストに含まれる隣接する単語(文字列)だけを結合し、数字はそのまま残す方法を解説します。以下の手順に沿って問題を解いていきましょう。解決の手順リストを初期化するisalphaメソッドを使って、数字以外の単語を抽出するjoinメソッドで単語同士を結合するisdigitメソッドで数字を抽出し、結果の末尾に追加する結果を出力する方法1: リスト内包表記を使うまずは、リスト内包表記を使って単語と数字をそれぞれ抽出する方法から見ていきます。# リストの初期化 strings = [Tutorials, 56, 45, point, 1, 4] # 結果格納用のリスト res
-
Pythonでリスト内のタプル要素を文字列に結合する方法
この記事では、Pythonを使ってリスト内のタプル要素を1つの文字列に結合する方法を解説します。組み込みの join メソッドと map 関数を組み合わせることで、シンプルかつ効率的に実装できます。以下の手順に沿って進めていきましょう。処理の手順文字列を含むタプルを持つリストを初期化します。タプルを引数として受け取り、文字列を返す関数 join_tuple_string を定義します。map(join_tuple_string, list) を使って、リスト内のすべてのタプルに結合処理を適用します。結果を list() でリストに変換します。結果を出力します。サンプルコード str:
-
Pythonで2つの文字列の共通部分を求める方法
はじめに Pythonでは、2つの文字列に共通して含まれる文字(共通部分・積集合)を抽出したい場面があります。本記事では、ループ処理を使った基本的な方法と、set(集合)を活用した効率的な方法の2つのアプローチを、実際のコード例とともにわかりやすく解説します。 方法1:ループ処理を使う方法 まずは、最も基本的なループ処理による方法です。以下の手順で問題を解決できます。 2つの文字列と、結果を格納するための空の文字列を用意します。 1つ目の文字列を先頭から順に走査し、現在の文字が2つ目の文字列にも含まれており、かつ結果の文字列にまだ存在しない場合にのみ追加します。 最終的な結果を出力します。
-
Pythonでネストされたリストの共通部分を求める2つの方法
この記事では、複数のリストを含む2つのリスト(ネストされたリスト)から共通部分を抽出する方法を、いくつかのアプローチに分けて解説します。まずは伝統的な方法から見ていきましょう。 方法1:リスト内包表記を使う 以下の手順で問題を解決します。 複数のリストを含む2つのリストを初期化する 1つ目のリストを反復処理し、現在の要素が2つ目のリストにも存在する場合に新しいリストへ追加する 結果を出力する サンプルコード # リストの初期化 list_1 = [[1, 2], [3, 4], [5, 6]] list_2 = [[3, 4]] # 両方のリストに共通する要素を見つける result =
-
Pythonでキーを使って2つの辞書の共通部分を求める方法
この記事では、Pythonでキーを使って2つの辞書を交差させる(共通部分を抽出する)方法を解説します。具体的には、両方の辞書に存在する共通のキーだけを持つ新しい辞書を作成します。まずは以下の例を見てみましょう。入力: dict_1 = {A: 1, B: 2, C: 3} dict_2 = {A: 1, C: 4, D: 5} 出力: {A: 1, C: 3}ここでは辞書内包表記を使ってこの問題を解決します。コードを書く手順は以下の通りです。2つの辞書を初期化する辞書1を反復処理し、辞書2にも存在するキーの要素を新しい辞書に追加する結果を出力する例:辞書内包表記を使う方法# 辞書の初期化 d
-
【Python】bisectモジュールで順序を維持したままソート済みリストに要素を挿入する方法
この記事では、ソート済みリストの順序を崩さずに新しい要素を挿入する方法を解説します。Pythonには標準ライブラリとして bisect モジュールが用意されており、これを使うとリスト内の適切な位置に要素を簡単に挿入できます。bisectモジュールとはbisect は二分探索(バイナリサーチ)を利用して、ソート済みシーケンスに対する挿入位置を高速に求めるための標準モジュールです。手動でループを回して挿入位置を探す必要がないため、コードがシンプルになり、パフォーマンスも向上します。実装の手順bisect モジュールをインポートする挿入対象のリストと、挿入したい要素を初期化するbisect.inso
-
Pythonでログストレージシステムを設計する方法
ここでは、各ログが一意のIDとタイムスタンプを持つログデータを扱うことを想定します。タイムスタンプは「年:月:日:時:分:秒」という形式の文字列で、たとえば「2019:01:01:23:59:59」のように表されます。すべてのフィールドはゼロ埋めされた10進数です。このようなログを効率的に管理するため、以下の2つの機能を持つログストレージシステムを設計します。void Put(int id, string timestamp): ログの一意なIDとタイムスタンプを受け取り、ストレージシステムに保存します。int[] Retrieve(String start, String end, Stri
-
Pythonで都市のスカイラインを維持したまま建物の高さを最大化する方法
2次元配列 grid があり、grid[i][j] の値はその位置に存在する建物の高さを表しています。任意の数の建物の高さを、任意の量だけ増やすことができます(高さ0も建物として扱います)。ただし重要な制約として、グリッドを上下左右の4方向から見たときの「スカイライン」は、元のグリッドのスカイラインと同一でなければなりません。都市のスカイラインとは、遠くから見たときにすべての建物が形成する長方形の外側の輪郭のことです。この条件下で、建物の高さを増やせる合計の最大値を求める必要があります。 問題の例 例えば、入力が次のようなグリッドだったとします。 3084245792360310 この場合の出
-
Pythonで二分探索木(BST)をシリアライズ・デシリアライズする方法
シリアライズとデシリアライズとは? 本記事では、二分探索木(BST:Binary Search Tree)をシリアライズおよびデシリアライズするアルゴリズムをPythonで設計する方法を解説します。 シリアライズ(直列化)とは、データ構造やオブジェクトをビット列や文字列へ変換し、ファイルやメモリバッファへの保存、あるいはネットワーク越しの送信を可能にする処理のことです。一方、デシリアライズ(逆直列化)は、シリアライズされたデータから元のデータ構造を復元する逆のプロセスを指します。 例として、次のような二分木を考えてみます。 [5, 2, 9, 1, 3, 7] この場合、処理結果は以下のように
-
Pythonで解くCampus Bikes II ― マンハッタン距離の総和を最小化する自転車割り当て問題
問題概要2次元グリッドで表現されたキャンパスに、N人のワーカーとM台の自転車があるとします。ただし、N ≤ M という条件が成り立ちます。各ワーカーと各自転車は、グリッド上の2次元座標で位置が与えられます。このとき、すべてのワーカーに対して重複なく自転車を1台ずつ割り当て、ワーカーとその割り当て先の自転車とのマンハッタン距離の総和を最小化することを考えます。2点 p1 と p2 のマンハッタン距離は、次の式で定義されます。dist(p1, p2) = |p1.x − p2.x| + |p1.y − p2.y|求めるべきは、全ワーカーとその割り当て自転車の間のマンハッタン距離の合計の最小値です。
-
Pythonで行・列のビット反転により2進行列の最大合計を求めるプログラム
問題概要2次元のバイナリ行列(各要素が0または1の行列)が与えられます。任意の行または列を選び、そのすべてのビットを反転(0を1に、1を0に変更)する操作を何度でも実行できます。各行を2進数として読み取ったとき、これらの数値の合計を最大化するには、どのように操作すべきでしょうか。具体例たとえば、次のような行列が入力されたとします。010001この場合の出力は 11 になります。2つの行をそれぞれ反転すると「101」と「110」になり、10進数では 5 + 6 = 11 となるためです。解法の考え方(貪欲法)合計を最大化する鍵は、大きい桁のビットを優先的に1にすることです。以下の2つの戦略を組み
-
Pythonで友達リストからグループ数を求める方法|DFSで連結成分を数えるアルゴリズム
友人関係のデータがリストとして与えられ、friends[i] には人 i の友達が誰なのかが格納されているとします。友情のつながりは双方向であり、各人は必ず自分自身とも友達であるものとみなします。また、互いの友人をたどる経路(パス)でつながっている2人は、同じ「友達グループ」に属すると定義されます。このとき、全体にいくつの友達グループが存在するかを求めるのがこの問題です。入力例と出力たとえば次のような入力を考えます。friends = [[0, 1, 5], [1, 0], [2], [3, 4], [4, 3], [5, 0]]この場合の出力は 3 になります。友達グループは以下の3つに分か
-
Pythonでリストの最後のインデックスに到達する最小ステップ数を求めるプログラム
問題の概要数値のリスト nums が与えられ、現在は nums[0] の位置にいるものとします。各ステップでは、現在のインデックス i から以下のいずれかに移動できます。i + 1(一つ右隣へ移動)i - 1(一つ左隣へ移動)j(nums[i] == nums[j] を満たす任意のインデックス j へジャンプ)このとき、リストの最後のインデックスに到達するまでに必要な最小ステップ数を求めます。例入力が nums = [4, 8, 8, 5, 4, 6, 5] の場合、出力は 3 になります。その理由は以下の通りです。インデックス 0 と インデックス 4 はどちらも値が 4 なので、インデック
-
Pythonでカット区間と交差しない区間を求めるプログラムの実装方法
ソート済みで互いに重なり合わない区間(インターバル)のリストと、削除対象となる1つの区間「カット」が与えられたとします。この課題では、カット区間と交差している部分をすべて取り除き、残った区間を新しいリストとして返すプログラムを作成します。 例えば、入力が intervals = [[2, 11], [13, 31], [41, 61]]、cut = [8, 46] の場合、出力は [[2, 8], [46, 61]] になります。 解決のためのアルゴリズム 以下の手順で問題を解くことができます。 カット区間の始点・終点をそれぞれ cut_start、cut_end に代入します。 結果を格納
-
Pythonで区間リストから重複しない期間の合計を求めるプログラム
各要素が区間 [start, end](両端を含む)を表すリストのリストがあるとします。このとき、これらの区間が実際にカバーしている重複しない期間の合計を求めたいと思います。例えば、入力が intervals = [[2, 11], [13, 31], [41, 61]] の場合を考えてみましょう。各区間がカバーする長さはそれぞれ以下のようになります。(11 − 2 + 1) = 10(31 − 13 + 1) = 19(61 − 41 + 1) = 21これらの区間は互いに重なり合っていないため、合計は 10 + 19 + 21 = 50 となります。解決のためのアプローチこの問題は、区間を