Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】英数字混在の文字列を「小文字→大文字→奇数→偶数」の順に並べ替える方法

英字と数字が混在した文字列 s が与えられたとき、次の条件に従って並べ替えることを考えます。

  • すべての小文字は、大文字よりも前に配置する。
  • すべての大文字は、数字よりも前に配置する。
  • 数字同士については、奇数を偶数よりも前に配置する。

たとえば、入力が s = "HeLlo1234" の場合、出力は eloHL1324 となります。

解き方のアプローチ

この問題は、各文字に対して「並び順を決めるための優先度コード」を計算し、その値をソートのキーとして使うことで解けます。具体的な手順は以下のとおりです。

  • 関数 f() を定義します。引数として1文字 c を受け取ります。
  • code を 0 で初期化します。
  • c が大文字の場合は、code = 10^3 とします。
  • c が数字の場合は、まず code = 10^6 とします。さらに、c のASCIIコードが偶数(つまり偶数の数字)であれば、code = 10^9 に変更します。
  • code + ord(c)(優先度コード+ASCIIコード)を返します。
  • メイン処理では、sorted() を使って文字列 s の各文字を f() の戻り値の昇順に並べ替え、結果を連結して返します。

なぜこの方法でうまくいくのか

ASCIIコードの性質上、単純にソートしても意図した順序にはなりません。そこで、文字の種類ごとに大きなオフセット値(10^3、10^6、10^9)を加算することで、「小文字 → 大文字 → 奇数の数字 → 偶数の数字」というグループ順序を強制的に作り出しています。同じグループ内ではASCIIコードそのものが比較されるため、それぞれアルファベット順・数値順に正しく整列します。

実装例

以下がPythonでの実装例です。

def f(c):
   code = 0
   if c.isupper():
      code = 10 ** 3
   elif c.isdigit():
      code = 10 ** 6
      if ord(c) % 2 == 0:
         code = 10 ** 9
   return code + ord(c)

def solve(s):
   l = sorted(s, key=lambda c: f(c))
   return ''.join(l)

s = "HeLlo1234"
print(solve(s))

入力

"HeLlo1234"

出力

eloHL1324
  1. Pythonで学ぶ選択ソートの基本原理と実装方法をわかりやすく解説

    本記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.xでの実装方法について詳しく解説します。 選択ソートとは? 選択ソートは、ソートされていない部分から最小値の要素を繰り返し見つけ出し、それを先頭に移動させることで配列全体を整列していくアルゴリズムです。処理の過程では、与えられた配列が次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーション(反復処理)では、未ソート部分から最小要素を取り出し、ソート済み部分の末尾に挿入していきます。この操作を繰り返すことで、最終的に配列全体

  2. Pythonで選択ソートを実装する方法|仕組みとサンプルコードをわかりやすく解説

    この記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.x(およびそれ以前のバージョン)での実装方法について解説します。 選択ソートとは 選択ソートは、ソートされていない部分から最小の要素を繰り返し見つけ出し、先頭側へ移動させることで配列全体を整列していくアルゴリズムです。処理の過程で、対象の配列は次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーションでは、未ソートの部分配列から最小要素を取り出し、ソート済みの部分配列の末尾に追加していきます。 アルゴリズムの動作イメー