-
【Python】元のリストを変更せずに逆順・ソートする方法|reversed()とsorted()の使い方
Pythonで数値のリストを扱う際、「リストを逆順にしたい」「並べ替え(ソート)をしたい」という場面はよくあります。しかし、ここでは元のリスト自体は変更しないことを前提とします。 リストにはreverse()メソッドやsort()メソッドが用意されていますが、これらを使うとリストはその場で(in-placeで)書き換えられてしまいます。元の順序を保持したまま新しい結果を得るには、代わりに組み込み関数のreversed()とsorted()を使用します。 たとえば、入力が l = [2,5,8,6,3,4,7,9] の場合、出力は次のようになります。 [9, 7, 4, 3, 6, 8, 5,
-
特定のタプルのハッシュ値を求めるPythonプログラム
数値がいくつか格納されたタプルがあるとします。ここでは、組み込み関数である hash() を使って、そのタプルのハッシュ値を求める方法を解説します。 hash() 関数は、int(整数)、float(浮動小数点数)、str(文字列)、タプルなどのデータ型に対して動作します。一方で、リストのようにハッシュ化できない型も存在します。リストは可変(mutable)なオブジェクトであり、内容が変更される可能性があるため、ハッシュ値を持たせることができないのです。 ハッシュ値は、辞書(dict)を使う際にキーから値へのマッピングを行うために内部的に利用されます。そのため、辞書のキーにはタプルは使えますが
-
英語の単語の大文字と小文字を入れ替えるPythonプログラム
英字で構成された文字列が与えられたとき、その文字列に含まれるすべての文字の大文字・小文字を入れ替える必要があります。つまり、大文字は小文字へ、小文字は大文字へと変換します。 例えば、入力が s = PrograMMinG の場合、期待される出力は pROGRAmmINg となります。 解法のアプローチ この問題を解くためには、以下の手順に従います。 結果を格納するための空の文字列 ret を用意します。 入力文字列 s の各文字について、次の処理を行います。 その文字が大文字であれば、小文字に変換したものを ret に連結します。 そうでなければ(小文字であれば)、大文字に変換したものを
-
文字列を空白で分割してカンマ区切りに変換するPythonプログラム
この記事では、空白(スペース)で区切られた複数の単語を含む文字列を処理し、各単語をリストに分割した後、単語と単語の間にカンマを挿入して1つの文字列として再結合する方法を解説します。問題の概要たとえば、次のような入力が与えられたとします。s = Programming Python Language Easy Funnyこの場合、期待される出力は以下のようになります。Programming, Python, Language, Easy, Funny解決の手順この問題は、Pythonの組み込みメソッド split() と join() を使うことで簡単に解決できます。手順は以下の通りです。wor
-
Pythonでコンソールから入力を読み取る方法を解説
この記事では、コンソールから名(firstname)と姓(lastname)を入力として受け取り、「Hello <firstname> <lastname>, you are welcome!」という形式のメッセージを出力するPythonプログラムを紹介します。文字列に変数の値を埋め込むには、format()メソッドを使用します。文字列内にプレースホルダーとして波括弧 {} を記述し、その後 format() 関数に引数を渡すことで、指定した位置に値が挿入されます。例えば、入力が「Ashish Dutta」であれば、出力は「Hello Ashish Dutta, you
-
Pythonで指定したインデックスの文字を置き換える方法
Pythonでは、文字列 s、インデックス i、置き換えたい文字 c が与えられたときに、s の i 番目の文字を c で置き換えたいという場面があります。文字列はイミュータブル(変更不可)である点に注意Pythonにおいて文字列はイミュータブル(immutable)なオブジェクトです。そのため、次のように直接代入しようとするとエラーが発生します。s[i] = c # TypeError: str object does not support item assignmentこのエラーは「str オブジェクトは要素への代入をサポートしていない」ことを意味します。つまり、リストとは異なり、文字
-
Pythonで指示確率変数から関数Fの期待値を計算するプログラムの実装方法
問題の概要2つの整数 k と n が与えられているとします。1 から n までの自然数 {1, 2, ..., n} のランダムな順列 p1, p2, ..., pn を考え、次の値 F を計算します。F = (X2 + ... + Xn−1)kここで Xi は指示確率変数(インジケーター確率変数)であり、以下のいずれかの条件が成り立つときに 1、それ以外のときに 0 を取ります。pi−1 < pi > pi+1(局所的な極大となる場合)pi−1 > pi < pi+1(局所的な極小となる場合)このとき、F の期待値 E[F] を求めることが目標です。たとえば、入力が
-
【Python】文字列内の部分文字列の出現回数をカウントする方法
問題の概要文字列 s と部分文字列 t が与えられたとき、t が s の中に何回出現するかを数えるプログラムを作成します。例えば、入力が s = abaabcaabababaab、t = aab の場合、出力は 3 になります。これは ab(aab)c(aab)abab(aab) のように、部分文字列 aab が3箇所に存在するためです。解決のアプローチこの問題は、以下の手順で解決できます。カウンター変数 cnt を 0 で初期化します。i を 0 から (s の長さ − t の長さ) まで順にループさせます。各位置 i において、s[i : i + len(t)] で切り出した部分文字列が
-
文字列に数字・小文字・大文字がすべて含まれているかを判定するPythonプログラム
ある文字列 s が与えられたとき、その文字列が以下の3種類の文字をすべて含んでいるかどうかを確認する方法を解説します。数字(0〜9)小文字のアルファベット(a〜z)大文字のアルファベット(A〜Z)注意: これ以外の記号や特殊文字が含まれていても構いませんが、上記の3種類は必ず含まれている必要があります。例えば、入力が s = p25KDs の場合、数字(2と5)、小文字(p、s)、大文字(K、D)がすべて含まれているため、出力は True になります。解決の手順この問題は、以下の手順で解くことができます。サイズ3の真偽値配列を作成し、すべて False で初期化します。各要素は「数字」「小文字
-
2n-1行でダイヤモンドパターンを表示するPythonプログラム
数値 n が与えられたとき、アスタリスク(*)を使って 2n−1 行からなるダイヤモンド(ひし形)パターンを描くことを考えます。1 行目から n 行目まではアスタリスクの数が 1 個ずつ増えていき、その後は n−1 個から 1 個へと減少していきます。 たとえば、入力が n = 5 の場合、出力は次のようになります。 * * * * * * * * * * * * * * * * * * * * * * * * * 解き方のアプローチ この問題は、次の手順で解くことができます。 i を 1 から n まで 1 ずつ増やしながら繰り返します。 「* 」
-
Pythonのtextwrapでテキストを指定した幅wの段落に折り返す方法
文字列 s と幅 w が与えられたとき、そのテキストを幅 w の段落に折り返して整形したいケースはよくあります。Pythonでは、標準ライブラリ textwrap に含まれる fill() 関数を使えば、この処理を非常に簡単に実現できます。まずは textwrap ライブラリをインポートしましょう。たとえば、入力が次のようになっているとします。s = The quick brown fox jumps over the lazy dogw = 9この場合、出力は以下のようになります。The quick brown fox jumps over the lazy dog解決の手順この問題は、次の
-
Pythonで文字を使ってドアマット模様を出力する方法|WELCOMEパターン
2つの整数 n と m が与えられ、m は n の倍数であるとします。このとき、中央に「WELCOME」という文字列が配置されたドアマットの模様を描くことを考えます。マットのサイズは n × m とし、使用できるのはドット(.)、ハイフン(-)、縦線(|)の3種類の記号と、中央に配置するテキストだけです。 例えば、入力が n = 5、m = 15 の場合、出力は次のようになります。 ------.|.------ ---.|..|..|.--- ----WELCOME---- ---.|..|..|.--- ------.|.------ このように、模様は上下対称になっており、中央の一行目か
-
【Python】1からnまでの数値の10進数・8進数・16進数・2進数を一覧表示する方法
問題概要 ある値 n が与えられたとします。ここでの課題は、1から n までの各整数について、10進数・8進数・16進数・2進数それぞれの表記を求め、4つの列にきれいに揃えて出力することです。 Pythonの書式指定では、d(10進数)、o(8進数)、X(16進数)、b(2進数)というプレフィックス文字を使うことで、同じ数値をさまざまな基数で手軽に表現できます。これらを組み合わせることで、目的の出力はごく短いコードで実現できます。 出力イメージ たとえば入力が n = 10 の場合、プログラムは次のような結果を出力します。 1 1 1 1 2 2 2
-
Pythonでアルファベットのランゴーリーパターンを出力するプログラム
数値 n が与えられたとします。ここでは、n × n サイズの「アルファベット・ランゴリー」を出力するプログラムを作成します。ランゴリーとは、インドの伝統的な装飾模様のことで、床などに描かれる幾何学模様を指します。n は 1 以上 26 以下の範囲内である必要があり、n が 26 の場合は「a」から始まり「z」で終わる模様になります。 例えば、入力が 5 の場合、出力は次のようになります。 --------e-------- ------e-d-e------ ----e-d-c-d-e---- --e-d-c-b-c-d-e-- e-d-c-b-a-b-c-d-e --e-d-c-b-c-
-
Pythonで各単語の先頭文字を大文字に変換するプログラム
英語の小文字だけで構成された文が与えられたとき、各単語の最初の文字だけを大文字に変換する方法を解説します。 たとえば、入力が s = i love my country の場合、出力は I Love My Country となります。 解決の手順 この問題は、以下のステップで解くことができます。 文字列 s を空白で分割し、単語のリストを作成する 結果を格納するための空のリストを用意する 各単語に対して capitalize() 関数を使って先頭文字を大文字化し、リストに追加する リスト内のすべての単語を空白区切りで連結して返す 実装例 実際のコードを見てみましょう。 def solv
-
Pythonで2つのリストのデカルト積(直積)を求める方法
2つのデータリスト l1 と l2 が与えられたとき、これらのデカルト積(直積)を求めることを考えます。デカルト積とは、2つのリストの要素をすべて組み合わせたペアの集合のことです。例えば、リストが (a, b) と (c, d) の場合、デカルト積は {(a, c), (a, d), (b, c), (b, d)} のようになります。 Pythonでは、標準ライブラリの itertools モジュールに含まれる product() 関数を使うことで、この処理を非常に簡単に実装できます。product() 関数はイテレータを返すため、list() コンストラクタに渡してリスト形式に変換する必要が
-
Pythonで解く!靴屋の在庫販売から総売上を計算するプログラム
問題の概要 ある靴屋には、サイズの異なる靴が n 足あり、それぞれのサイズは配列 size に格納されています。さらに、m 人の顧客の需要を表すペアのリスト demand が与えられ、demand[i] は (靴のサイズ, 支払額) という形式になっています。つまり、i 番目の顧客は shoe_size サイズの靴を希望しており、指定された金額を支払うことができます。このとき、店主が靴を売って得られる合計金額を求めるのがこの問題です。 入力例と出力の確認 たとえば、次のような入力が与えられたとします。 shoes = [2,3,4,5,6,8,7,6,5,18] demand = [(6,5
-
PHPのmb_list_encodings()関数でサポートされている全エンコーディングを配列として取得する方法
PHPのmb_list_encodings()関数は、現在の環境でサポートされているすべての文字エンコーディングを配列として返します。この関数はPHP 5以降のバージョンで利用可能です。マルチバイト文字列処理を行う際に、対応しているエンコーディングの一覧を確認したい場合に便利な関数です。構文array mb_list_encodings()パラメータmb_list_encodings()は引数を受け取りません。戻り値この関数は、サポートされているエンコーディング名を格納した数値インデックス付きの配列を返します。各要素には「UTF-8」や「SJIS」などのエンコーディング名が文字列として含まれま
-
【Python】itertools.permutations()で文字列から長さrの順列をすべて生成する方法
はじめに 文字列 s と数値 r が与えられたとき、s の中から r 個の文字を選んで作ることができるすべての順列(並べ方)を表示するプログラムを作成してみましょう。 Python の標準ライブラリ itertools には、順列を簡単に生成できる permutations() 関数が用意されています。この関数を活用すれば、わずか数行のコードで目的を実現できます。 入力例と出力イメージ たとえば、入力が s = HELLO、r = 3 の場合、出力は次のようになります。 [HEL, HEL, HEO, HLE, HLL, HLO, HLE, HLL, HLO, HOE, HOL, HOL,
-
複素数を極座標(半径・角度)に変換するPythonプログラムの書き方
Pythonでは、複素数を極座標形式(半径と角度のペア)に変換することができます。本記事では、x + yj の形式で表される複素数 c を極座標へ変換する方法を、具体例とともにわかりやすく解説します。 複素数と極座標の基本 複素数 c = x + yj を極座標で表す場合、次の2つの値が必要になります。 半径(絶対値):複素数の大きさを表し、√(x² + y²) で計算されます。 角度(偏角):正の実軸(x軸の正方向)から、原点と複素数 x + yj を結ぶ線分までの反時計回りの角度です。 cmathライブラリを使った変換方法 Pythonの標準ライブラリである cmath を使うと、