Pythonのzip()関数で文字列を新しい文字セットに変換する方法
26文字からなる文字セットが与えられたとき、ここでは「新しい文字セット」を使用します。これは、通常のアルファベット(a, b, c … z)とは並び順が異なる文字セットです。この記事の課題は、新しい文字セットと標準的な英字アルファベットとの間に対応関係(マッピング)を作り、入力された文字列を新しい文字セット上の文字へ変換することです。
例
新しい文字セット: qwertyuiopasdfghjklzxcvbnm 入力: "wwmn" 出力: bbzy
この例では、「qwertyuiopasdfghjklzxcvbnm」という新しい文字セットの各文字が、先頭から順に a, b, c … z に対応しています。したがって「w」は「b」、「m」は「z」、「n」は「y」に変換されます。
アルゴリズム
- 新しい文字セットと、変換対象の文字列を受け取ります。
- 元となる英字アルファベットセット(a〜z)を用意します。
- 辞書(dict)を作成します。ここではマッピングの手法を使い、Pythonのzip()関数で英字セットと新しい文字セットを先頭から順にペアリングし、対応表を作ります。
- 入力文字列を反復処理しながら、各文字を辞書で対応する英字に置き換えます。
- 変換後の文字をスペースなしで連結し、新しい文字列として出力します。
サンプルコード
# 文字列を新しい文字セットに変換する関数
def newString(cs, n):
ori = 'abcdefghijklmnopqrstuvwxyz'
newchar = dict(zip(cs, ori))
newstr = [newchar[c] for c in n]
print(''.join(newstr))
# ドライバプログラム
if __name__ == "__main__":
newcharSet = 'qwertyuiopasdfghjklzxcvbnm'
input_str = 'wwmn'
newString(newcharSet, input_str)
コードのポイント
zip(cs, ori)は、2つの文字セットを先頭から順にペアにします。dict()でそのペアを「キーと値」の辞書に変換し、文字の対応表を作ります。- リスト内包表記で入力文字列の各文字を変換し、
join()で連結して結果を得ます。
出力
bbzy
この手法の計算量は O(n)(nは入力文字列の長さ)であり、辞書による参照は O(1) で行えるため非常に効率的です。同じ考え方は、単純な暗号化・復号化や文字コードの置き換えなど、さまざまな場面で応用できます。
-
Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説
本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値
-
Pythonのintersection()関数とは?集合の共通要素(積集合)を求める方法
この記事では、Pythonのセット(集合)に対して実行できるintersection()関数について詳しく解説します。数学における「積集合(インターセクション)」とは、2つの集合から共通する要素を見つけ出すことを指します。構文<セット名>.intersection(<セットa1>, <セットa2>, …)戻り値引数として渡されたすべての集合に共通する要素(積集合)が、新しいセットとして返されます。使用例set_1 = {t,u,t,o,r,i,a,l} set_2 = {p,o,i,n,t} set_3 = {t,u,t} # 2つの集合の積集合 print