-
Pythonの辞書で値からキーを取得する2つの方法
Pythonの辞書(dict)は「キー」と「値」のペアでデータを管理するコレクションです。通常はキーを指定して値を取り出しますが、この記事ではその逆――値がわかっているときに、対応するキーを取得する方法を2つ紹介します。 方法1:keys()・values()・index()を組み合わせる 辞書のkeys()メソッドとvalues()メソッドでそれぞれキーと値のリストを作成し、リストのindex()メソッドで目的の値の位置を特定します。キーと値は同じ順序で並んでいるため、同じインデックスを指定すれば対応するキーが取得できます。 サンプルコード dictA = {Mon: 3, Tue: 11,
-
Pythonの辞書で値が最大のキーを取得する方法
Pythonの辞書(dict)は、キーと値のペアを格納するデータ構造です。本記事では、与えられた辞書の中から値が最大である要素のキーを取得する方法を、代表的な2つの手法に分けて解説します。 方法1:max()関数とget()メソッドを使う 最も簡潔なのが、組み込みのmax()関数と辞書のget()メソッドを組み合わせる方法です。max()関数はデフォルトで辞書のキーを走査するため、key=dictA.getを指定すると「各キーに対応する値」を比較基準として、値が最大のキーが返されます。 サンプルコード dictA = {"Mon": 3, "Tue"
-
Pythonでリストの末尾からN個の要素を取得する方法
Pythonのリストを扱っていると、先頭ではなく末尾(最後)の数個の要素だけを取り出したい場面がよくあります。例えば、最新のログエントリや直近のデータだけを取得したいケースなどです。この記事では、代表的な2つの方法「スライス」と「itertools.islice」を使った実装例を紹介します。 方法1:スライス(負のインデックス)を使う 最もシンプルで一般的な方法は、スライス記法に負の値を組み合わせることです。取得したい要素数を n として、[-n:] のように指定すると、リストの末尾からn個の要素を簡単に切り出せます。 コード例 listA = [Mon,Tue,Wed,Thu,Fri,Sat
-
Pythonでリスト間の一致する要素のインデックスを取得する方法
Pythonでは、2つのリストが与えられたときに、1つ目のリストの中から「2つ目のリストの要素と値が一致する要素」のインデックス(位置)を取得したいケースがあります。例えば、曜日のリストから特定の曜日が何番目に位置するかを調べるような場面です。本記事では、この処理を実現する代表的な2つの方法を、サンプルコードと実行結果とともに解説します。方法1:index()メソッドを使う最もシンプルなのが、リストのindex()メソッドを活用する方法です。2つ目のリストの各要素について、1つ目のリスト内での位置を順番に取得し、リスト内包表記でまとめます。サンプルコードlistA = [Mon,Tue, We
-
Pythonで整数を英語の単語(英字表記)に変換する方法を解説
はじめにこの記事では、0から231−1までの範囲にある任意の整数を受け取り、それを英語の単語表記に変換するPythonプログラムを紹介します。例えば、入力が「512」であれば、出力は「Five Hundred Twelve」となります。アルゴリズムの考え方数値を単語に変換するには、以下の手順で処理を進めます。1から19までの英単語を格納するリスト less_than_20 を定義します。「Twenty」「Thirty」など10の位の単語を格納するリスト tens を定義します。「Thousand」「Million」「Billion」を格納するリスト thousands を定義します。999以下
-
IPv4とIPv6の違いを徹底解説!知っておきたい6つの主要な相違点
IPv4とIPv6とは?IPv4とIPv6は、インターネットプロトコルスイートにおいて、データグラムをネットワーク境界を越えて中継するための主要な通信プロトコルとして使用される、2大インターネットプロトコルです。これらのルーティング機能によりインターネットワーキングが実現され、事実上、今日のインターネットの基盤が確立されています。本記事では、機能や特徴の観点から、IPv4とIPv6の違いをわかりやすく解説します。IPv4とIPv6の主な違い一覧以下の表は、IPv4とIPv6プロトコルの重要な相違点をまとめたものです。番号項目IPv4プロトコルIPv6プロトコル1アドレス設定32ビットのアドレス
-
Pythonで配列から特定の値をすべて削除する方法
問題の概要配列 nums と値 val が与えられたとき、val と等しいすべての要素を配列内でその場で削除し、残りの要素数(新しい長さ)を求めます。例えば、入力が [0,1,5,5,3,0,4,5]、val が 5 の場合、値 5 は3つ含まれているため、削除後の長さは 5 になります。解決のアプローチこの問題は、書き込み位置を示すカウンタを1つ用意することで、追加のメモリを使わずに解決できます。手順は以下の通りです。カウント変数 count を 0 で初期化します。配列 nums の各インデックス i に対して次の処理を繰り返します。nums[i] が val と等しくない場合は、nums
-
Pythonでブーメラン(等距離点タプル)の数を数えるアルゴリズムと実装
問題の概要平面上に互いに異なる n 個の点が与えられているとします。ここで「ブーメラン」とは、点のタプル (i, j, k) のうち、i と j の距離が i と k の距離と等しいものを指します。この問題では、与えられた点集合の中にブーメランがいくつ存在するかを求めます。例えば、入力が [[0,0],[1,0],[2,0]] の場合、出力は 2 になります。これは、[[1,0],[0,0],[2,0]] と [[1,0],[2,0],[0,0]] という2つのブーメランが存在するためです。頂点となる点 [1,0] から見て、残りの2点までの距離が等しいので、順序の異なる2通りの組み合わせが成
-
Pythonで解く「ヒーター」問題 ― 全ての家を暖める最小半径を求めるアルゴリズム
ヒーター問題とは 一定の暖房半径を持つ標準的なヒーターを設計し、すべての家を暖めることを考えます。水平線上に並ぶ家とヒーターの位置情報が与えられたとき、すべての家を確実にカバーできるヒーターの最小半径を求めるのがこの問題の目的です。 具体的には、家の位置リストとヒーターの位置リストがそれぞれ別に渡され、出力としては必要な最小の半径を返します。 例えば、入力が [1,2,3,4] と [1,4] の場合、出力は 1 となります。ヒーターが位置 1 と 4 に配置されており、半径 1 に設定すれば、位置 2 と 3 の家も含めてすべての家を暖めることができるためです。 解法のアプローチ この問題
-
Pythonで解く「逆文字列 II」― 2k文字ごとに先頭k文字を反転する方法
問題概要 文字列 s と整数 k が与えられます。文字列の先頭から数えて 2k 文字ごとのブロックについて、それぞれのブロック内の最初の k 文字を反転してください。ただし、以下のルールに従います。 残りの文字が 2k 文字未満で k 文字以上の場合: 最初の k 文字のみを反転し、残りは元のままにします。 残りの文字が k 文字未満の場合: 残りの文字をすべて反転します。 たとえば、入力が abcdefgh、k = 3 のとき、出力は cbadefhg となります。これは、最初の 6 文字 abcdef のうち先頭 3 文字 abc が cba に反転され、残りの gh は k 文字未満
-
Pythonで二分木を前順走査して文字列を構築する方法
二分木が与えられたとき、前順走査(先行順トラバーサル)の方法で木をたどり、括弧と整数からなる文字列を構築することを考えます。ヌルノードは空の括弧のペア「()」で表現します。ただし、文字列と元の二分木との一対一の対応関係に影響しない空の括弧のペアは、すべて省略する必要があります。例えば、次のような二分木が入力として与えられた場合を考えてみましょう。この場合、出力は 5(6()(8))(7) となります。左の子が存在し、そのさらに右に子があるため「6()(8)」のように空の括弧が必要になりますが、それ以外の不要な空の括弧は省略されています。解法のアプローチこの問題を解くために、以下の手順に従います
-
Pythonで解く「野球ゲーム」スコア計算問題 ― スタックを使った実装方法
野球ゲームの得点記録プログラムを考えてみましょう。文字列のリストが与えられ、各文字列は次の4種類のいずれかであるとします。 整数(その回のスコア) ― この回で獲得する得点をそのまま表します。 +(その回のスコア) ― 直前の2つの有効な回の得点の合計が、この回の得点になります。 D(その回のスコア) ― 直前の有効な回の得点を2倍した値が、この回の得点になります。 C(操作であり、スコアではない) ― 直前の有効な回の得点が無効であったことを意味し、その得点を記録から取り消します。 ここで重要なのは、各回の操作が永続的であり、前後の回の計算に影響を及ぼしうるという点です。最終的に、すべて
-
Pythonで従業員の重要度合計を求めるアルゴリズム(BFSを使った解法)
問題の概要従業員情報を表すデータ構造を考えてみましょう。各従業員には「一意のID」「重要度(importance)の値」「直属の部下のIDリスト」が含まれています。例として、従業員1が従業員2の上司であり、従業員2が従業員3の上司であるケースを見てみます。それぞれの重要度が15、10、5である場合、データ構造は次のようになります。従業員1:[1, 15, [2]]従業員2:[2, 10, [3]]従業員3:[3, 5, []]このように会社全体の従業員情報と特定の従業員IDが与えられたとき、「その従業員本人と、すべての部下(間接的な部下も含む)の重要度の合計」を求めるのが本記事のゴールです。入
-
Pythonでストリーム内のK番目に大きい要素を求める方法
本記事では、データストリームの中からK番目に大きい要素を求めるクラスをPythonで設計する方法を解説します。ここでの「K番目に大きい」とは、ソート順におけるK番目の位置にある要素を指し、重複を除いた「K番目に大きい値(distinct)」とは異なる点に注意してください。 問題の概要 KthLargest クラスは、整数 k と初期データを格納した配列 nums を受け取るコンストラクタを持ちます。その後、add(val) メソッドが呼び出されるたびに、新しい値をストリームに追加し、その時点でのK番目に大きい要素を返します。 動作例 例えば、k = 3、初期要素が [4, 5, 8, 2]
-
組み込みライブラリを使わずにPythonでHashSet(ハッシュセット)を実装する方法
本記事では、Pythonの組み込みハッシュテーブルライブラリを使用せずに、HashSet(ハッシュセット)データ構造をゼロから設計・実装する方法を解説します。実装すべき主な操作は以下の3つです。add(x) ― 値 x をHashSetに挿入しますcontains(x) ― 値 x がHashSetに存在するかどうかを判定しますremove(x) ― 値 x をHashSetから削除します。値が存在しない場合は何もしません動作確認のシナリオまずHashSetを初期化し、その後 add(1) → add(3) → contains(1) → contains(2) → add(2) → cont
-
【Python】組み込みライブラリを使わずにHashMap(ハッシュマップ)を設計する方法
この記事では、Pythonの組み込みハッシュテーブルライブラリ(dictなど)に頼らず、ゼロからHashMap(ハッシュマップ)を設計する方法を解説します。ハッシュマップは「キーと値のペア」を効率的に管理するデータ構造であり、以下の3つの基本操作をサポートする必要があります。 実装すべき3つの基本メソッド put(key, value) ― 指定したキーに対応する値をハッシュマップに挿入します。同じキーが既に存在する場合は、値を新しいものに更新します。 get(key) ― 指定したキーにマッピングされた値を返します。キーが存在しない場合は -1 を返します。 remove(key) ― 指
-
Pythonで解く「1ビット文字と2ビット文字」の判定問題|アルゴリズムと実装例
問題の概要ここでは、2種類の特殊な文字を扱います。1つ目の文字は1ビットの「0」で表現され、2つ目の文字は2ビットの「10」または「11」で表現されます。複数のビットから構成される文字列が与えられたとき、その最後の文字が必ず1ビット文字になるかどうかを判定するのが課題です。なお、与えられるビット列は必ず0で終わることが保証されています。入力例と出力例たとえば、入力が [1,0,0] の場合、出力は True になります。これは、このビット列をデコードできる方法が「2ビット文字(10)」と「1ビット文字(0)」の組み合わせしか存在しないためです。したがって、最後の文字は1ビット文字であると結論付
-
【Python】辞書の中で1文字ずつ構築できる最長の単語を見つける方法
問題概要 英単語のリスト(英語の辞書を表す配列)が与えられたとき、リスト内の他の単語を使って1文字ずつ構築できる単語のうち、最も長いものを見つける問題を考えます。条件を満たす候補が複数存在する場合は、辞書順で最も小さいものを返します。該当する単語がひとつもない場合は、空文字列を返します。 たとえば、入力が [h, he, hel, hell, hello] の場合を考えてみましょう。「hello」は「h」→「he」→「hel」→「hell」→「hello」という順序で1文字ずつ作ることができるため、出力は hello となります。 解法の考え方:トライ木(Trie)を使う この問題は、接頭辞
-
Pythonでターゲット文字より大きい最小の文字を二分探索で見つける方法
ソート済みの小文字アルファベットのリスト letters と、ターゲットとなる文字 t が与えられたとき、リストの中から「t よりも大きい文字のうち最小のもの」を探す問題を考えてみましょう。このとき、文字は循環(ラップアラウンド)するとします。つまり、target = z で letters = [a, b] のような場合、z より大きい文字が存在しないため、先頭に戻って答えは a になります。例えば、入力が [c, f, j] で target が a の場合、a より大きい最小の文字は c なので、出力は c となります。解き方のアプローチ:二分探索リストがソート済みであるため、二分探索(
-
Pythonで解く「最小コストの階段登り」問題:動的計画法による実装方法
各段に負でないコスト値 cost[i] が割り当てられた階段があるとします。コストを支払うことで、1段または2段を一度に登ることができます。ここでの目的は、階段の最上部に到達するための最小コストを求めることです。なお、スタート地点はインデックス0の段、またはインデックス1の段のどちらかを自由に選ぶことができます。 例として、入力が cost = [12,17,20] の場合を考えてみましょう。このときの出力は 17 となります。理由は、インデックス1の段からスタートしてコスト17を支払い、そこから直接頂上へ向かうのが最も安く済むためです。 解き方のアプローチ この問題は動的計画法(DP)を使う