-
Pythonのtime.process_time()関数でCPU時間を計測する方法
time.process_time()とは このチュートリアルでは、Pythonのtime.process_time()メソッドについて詳しく解説します。 time.process_time()は、現在のプロセスにおけるシステムCPU時間とユーザーCPU時間の合計を、秒単位の浮動小数点数(float値)として返します。スリープ中の待機時間は含まれず、CPUが実際に処理に費やした時間だけを計測できる点が大きな特徴です。 基本的な使い方 まずは、timeモジュールをインポートして現在のプロセス時間を出力する、シンプルな例から見ていきましょう。 # timeモジュールをインポート import ti
-
Pythonのtime.sleep()メソッドの使い方を徹底解説!プログラムの実行を一時停止する方法
このチュートリアルでは、Pythonのtime.sleep()メソッドについて詳しく解説します。 time.sleep()メソッドは、プログラムの実行を一定時間だけ一時停止したい場合に使用します。引数には秒数を指定し、プログラムはその時間が経過するまで待機してから次の処理に進みます。小数点以下の値(例:0.5秒)も指定可能です。 このメソッドを使うには、あらかじめ標準ライブラリのtimeモジュールをインポートしておく必要があります。 基本的な使い方 まずはシンプルな例を見てみましょう。以下のコードを実行すると、1秒間の遅延があることを確認できます。 # timeモジュールをインポート impo
-
Pythonのmath.trunc()メソッドとは?小数点以下を切り捨てる方法を解説
このチュートリアルでは、Pythonのmath.trunc()メソッドについて詳しく解説します。math.trunc()は、浮動小数点数(float)の小数点以下を切り捨て、整数部分だけを取り出すためのメソッドです。挙動としては、正の値に対してはmath.floor()と同じ結果を返し、負の値に対してはmath.ceil()と同じ結果を返します。math.trunc()の基本的な使い方(正の数の場合)まずはmathモジュールをインポートして、正の数に対するfloor()とtrunc()の動作を比較してみましょう。# mathモジュールをインポート import math # floor()の
-
Pythonで配列を長さK以上の増加部分列に分割できるか判定する方法
問題の概要 正の整数からなる非減少配列(広義単調増加の配列) nums と整数 K が与えられます。このとき、配列全体を「長さが K 以上の互いに重複しない(disjoint な)増加部分列」に 1 つ以上分割できるかどうかを判定するのが目的です。 入力例と出力例 nums = [1,2,2,3,3,4,4]、K = 3 の場合、答えは true になります。実際、この配列は [1,2,3,4] と [2,3,4] という 2 つの部分列に分割でき、どちらも長さが 3 以上であるため条件を満たします。 解き方のポイント 鍵となるのは「同じ値は 1 つの増加部分列に 2 度現れない」という性質
-
Pythonで解く並行コース問題 ― BFSで全コース修了に必要な最小学期数を求める
問題の概要 N個のコースがあり、それぞれ1からNまでの番号が付けられています。さらに、前提関係を表す配列 relations が与えられ、relations[i] = [X, Y] は「コースXはコースYの前提科目である」ことを意味します。つまり、コースYを受講する前に、必ずコースXを修了しておかなければなりません。 1つの学期では、受講したいコースの前提科目がすべて修了済みであれば、何コースでも同時に履修できます。このとき、すべてのコースを修了するために必要な最小の学期数を求めてください。なお、前提関係に循環が含まれるなどして、すべてのコースを修了できない場合は -1 を返します。 入力
-
Pythonで文字列を別の文字列に変換できるか判定する方法
問題の概要 同じ長さを持つ2つの文字列 str1 と str2 が与えられます。0回以上の「変換」操作を繰り返すことで、str1 を str2 へ変換できるかどうかを判定してください。 ここでいう1回の変換とは、str1 内に出現するある1種類の文字を、すべて別の小文字の英字へ一括して置き換える操作を指します。例えば、文字 a をすべて c に変えるといった具合です。 具体例 str1 = aabcc、str2 = ccdee の場合、出力は True になります。手順としては、まず c を e に変換し、次に b を d に、最後に a を c に変えればよいためです。 このとき重要なのは
-
Pythonで村の配水網を最適化する:Union-Findと最小全域木で最小コストを実現
問題の概要ある村に n 軒の家があるとします。すべての家へ水を供給するためには、井戸を掘るか、パイプを敷設する必要があります。各家庭 i については、次の2つの選択肢があります。その家の中に井戸を建設する(費用は wells[i])別の場所にある井戸からパイプで水を引く家同士をパイプでつなぐ費用は配列 pipes で与えられ、pipes[i] は [house1, house2, cost] という形式で、house1 と house2 をつなぐパイプの敷設コストを表します。接続は双方向であることに注意してください。求めるのは、すべての家に水を供給するための最小総費用です。入力例n = 3、w
-
Pythonで解くマトリックス内の最長増加パス ― DFSとメモ化による効率的な実装
問題概要マトリックス(二次元配列)が与えられたとき、その中に存在する最長増加パスの長さを求めることを考えます。各セルからは上下左右の4方向へ移動できますが、斜め方向への移動やマトリックスの境界外への移動は禁止されています。例として、次のようなマトリックスを見てみましょう。994668211この場合の出力は 4 となります。緑色で示したセルをたどる [1, 2, 6, 9] というパスが最長の増加パスだからです。解法のアプローチ:DFS + メモ化再帰この問題は、深さ優先探索(DFS)にメモ化を組み合わせることで効率的に解けます。ポイントは、「各セルから始まる最長増加パスの長さ」をdpテーブルに
-
PythonでLFUキャッシュ(Least Frequently Used)を実装する方法
LFUキャッシュとは LFU(Least Frequently Used:最低頻度使用)キャッシュは、使用頻度が最も低いデータを優先的に追い出すキャッシュアルゴリズムです。本記事では、Pythonを使ってLFUキャッシュのデータ構造を設計・実装する方法を解説します。 実装するLFUキャッシュは、以下の2つの操作をサポートする必要があります。 get(key) – キーがキャッシュ内に存在する場合はその値を返し、存在しない場合は -1 を返します。 put(key, value) – キーがまだ存在しない場合に、キーと値を設定または挿入します。 キャッシュが最大容量に達した場合は、新しい要素
-
PythonのopenpyxlでExcelファイルに対して算術演算を行う方法
Pythonを使えば、Python環境から直接Excelファイルを操作できます。ワークシート内の特定のセルやセル範囲を参照し、そこに対して算術演算を適用することが可能です。さらに、演算結果もPythonプログラムで指定した任意のセルに保存できます。 以下の例では、Excelに組み込まれた関数(SUMやAVERAGEなど)を利用してさまざまな算術演算を実行します。まずopenpyxlモジュールでワークブックを作成してアクティブにし、あらかじめ決めておいたセルに値を書き込みます。その後、それらのセル範囲に対して関数を適用し、計算結果を別のセルに出力します。 使用する主なExcel関数 SUM:指
-
Python Tkinterのasksaveasfile()関数の使い方を徹底解説
TkinterとはTkinterは、PythonでGUI(グラフィカルユーザーインターフェース)プログラミングを行うための標準モジュールです。キャンバス(Canvas)を作成し、その中にさまざまなプロパティや動作を持つUIコンポーネントを配置することで、アプリケーションの画面を構築していきます。本記事では、asksaveasfile()関数を使って、Pythonプログラムで作成したファイルをローカルドライブに保存する方法を解説します。処理の流れまず、ベースとなるウィンドウを作成し、その上にttk.Button関数を使ってボタンを配置します。次に、別の関数を定義し、その中でasksaveasfi
-
Pythonでリスト内の連続するn個の要素ごとの平均値を求める方法
数値のみを含むリストが与えられたとき、先頭の要素から順にスライドさせながら、連続するn個の要素のセットを取り出し、それぞれの平均値を計算する方法を解説します。これは「移動平均(ローリング平均)」と呼ばれる処理で、データ分析などでもよく使われるテクニックです。例以下の例では、リスト内の連続する4つの要素ごとの平均を求める要件をシンプルに示しています。与えられたリスト: [10,12,14,16,18,20,22,24,26] 連続する4つの数字ごとのセグメントの平均: [13.0, 15.0, 17.0, 19.0, 21.0, 23.0]sum関数とrange関数を使う方法まずは最も基本的な
-
Pythonでインスタンス間にクラス変数が共有されるのを防ぐ2つの方法
Pythonでは、クラスをインスタンス化すると、そのクラスが持つ変数や関数は新しいインスタンスにも引き継がれます。しかし、親クラス(元のクラス)の一部の変数を子クラスや他のインスタンスと共有したくない場合もあります。本記事では、インスタンス間でのデータ共有を回避するための2つの方法を解説します。 インスタンス化の例 まず、通常のクラス定義ではどのように変数が共有されるのかを見てみましょう。以下の例では、クラス変数として定義されたリストが、すべてのインスタンス間で共有されてしまう様子を確認できます。 class MyClass: listA = [] # 2つのインスタンスを生成 x
-
Pythonのbisectモジュール徹底解説:insort_leftとinsort_rightの使い方
Pythonのbisectモジュールは、新しい要素を挿入するたびにリスト全体を再ソートすることなく、リストをソート済みの状態に保つための機能を提供します。本記事では、その中でも特に重要なinsort_leftとinsort_rightの2つの関数に焦点を当てて解説します。 insort_leftとは insort_leftは、指定した値を適切な位置に挿入し、リスト自体を直接更新します。すでに同じ値がリスト内に存在する場合は、その要素群の左端(既存要素の前)に挿入されるのが特徴です。 この関数は最大4つの引数を受け取ります。 a:操作対象のリスト x:挿入する値 lo:検索範囲の開始位置(デフ
-
【Python】NumPyのブロードキャストとは?配列演算のルールと具体例をわかりやすく解説
通常、配列同士の算術演算は、両者のサイズが完全に一致しているか、互換性のある特定のサイズである場合にのみ実行できます。しかしNumPyには、サイズの異なる配列同士でも演算を可能にする「ブロードキャスト(broadcasting)」という強力な仕組みが備わっています。 ブロードキャストでは、次元数(ndim)が小さい方の配列の形状の先頭に「1」を追加して拡張することで、演算対象となる配列同士の形状を揃えます。つまり、ブロードキャストとは、配列の形状を演算に必要な形状へ自動的に変換する機能のことです。 配列ブロードキャストのルール 他方の配列より次元数(ndim)が小さい配列は、その形状の先頭に
-
Pythonで指定したリストをネストされたリスト(リストのリスト)に変換する方法
Pythonでは、リスト内の各要素を、それ自体がリストである形式へと変換したいケースがあります。つまり、要素そのものがリストになっている「ネストされたリスト(リストのリスト)」を作成するということです。本記事では、代表的な2つのアプローチ——反復処理を使う方法とastモジュールを使う方法——について、具体的なコード例とともに解説します。反復処理(イテレーション)を使う方法最も基本的なアプローチは、リストの各要素を1つずつ取り出し、それぞれをリスト形式に変換していく方法です。一時的なリスト(temp)を活用しながら変換を行い、最終的にすべての要素をまとめて、目的となる「リストのリスト」を生成しま
-
Pythonで値なし(None)の辞書をリストから作成する3つの方法
Pythonでは、リストの各要素をキーとし、対応する値をNone(プレースホルダー)とした辞書を作成したい場面があります。例えば、あとから値を順番に埋めていくための「空の辞書」を用意しておきたいときなどに便利です。この記事では、代表的な3つの方法をコード例とともに紹介します。 方法1:dict.fromkeys() を使う dict() はPythonで辞書を生成するための組み込みコンストラクタです。中でも fromkeys() メソッドを使うと、キーのシーケンスと共通のデフォルト値から簡単に辞書を作成できます。値を省略した場合は、すべてのキーに None が自動的に設定されます。 サンプルコ
-
Pythonで2つの辞書のキーの差分を取得する方法【集合演算・forループ】
Pythonでは、2つの辞書の間に共通するキーが含まれることがよくあります。この記事では、2つの辞書に存在するキーの差分(違い)を取得する方法を解説します。 set(集合)を使った方法 まず、2つの辞書に対してset()関数を適用し、それぞれを集合に変換します。その後、2つの集合の差分を計算することで、キーの違いを求められます。片方向だけでなく、「1つ目の辞書から2つ目の辞書を引く」「2つ目の辞書から1つ目の辞書を引く」という両方向で計算することで、どちらかにのみ存在するキーがすべて結果として得られます。 サンプルコード dictA = {1: Mon, 2: Tue, 3: Wed} pri
-
Pythonのprint()関数におけるendパラメーターの使い方
Pythonのprint()関数は、デフォルトでは出力の最後に必ず改行(\n)を追加します。しかし実は、この関数にはendパラメーターが用意されており、改行の代わりに任意の文字列を末尾に出力するよう指定することができます。この記事では、endパラメーターのさまざまな使い方とその挙動について詳しく解説します。基本的な仕組みprint()関数の構文は以下の通りです。print(オブジェクト, ..., sep= , end=\n)endパラメーターのデフォルト値は改行文字 \n です。この値を空白や記号など別の文字列に変更することで、複数のprint()呼び出しの出力を1行につなげたり、独自の区切
-
Pythonのabs()とfabs()の違いとは?絶対値を求める2つの関数を徹底解説
Pythonには数値の絶対値(absolute value)を取得するための関数として、組み込み関数の abs() と、mathモジュールに含まれる math.fabs() の2つが用意されています。どちらも数値の絶対値を返すという点では同じ役割を持っていますが、戻り値の型や扱えるデータ型において重要な違いがあります。本記事では、具体的なコード例とともに、両者の違いをわかりやすく解説します。 abs()とfabs()の主な違い abs() 関数は、引数として渡された値に応じて、整数(int)または浮動小数点数(float)のいずれかで絶対値を返します。つまり、整数を渡せば整数型の結果が、浮動小