Pythonで偶数は昇順・奇数は降順に並べ替えるプログラムの書き方
問題の概要
数値のリスト nums が与えられたとき、以下の条件をすべて満たすように配列を並べ替えることを考えます。
- 偶数は昇順(小さい順)に並べ替える
- 奇数は降順(大きい順)に並べ替える
- 偶数と奇数の相対的な位置関係は変更しない
例えば、入力が [9, 14, 12, 91, -4, 5] の場合、出力は [91, -4, 12, 9, 14, 5] となります。
解決のアプローチ
この問題は、次の手順で解くことができます。
- evens:nums 配列から偶数だけを取り出したリストを作成する
- odds:nums 配列から奇数だけを取り出したリストを作成する
- evens リストを昇順にソートする
- インデックス even_i := 0、odd_i := 0 として初期化する
- index を 0 から nums のサイズまで繰り返す
- nums[index] を 2 で割った余りが 0 の場合(偶数の場合)
- nums[index] := evens[even_i]
- even_i := even_i + 1
- それ以外の場合(奇数の場合)
- nums[index] := odds[odd_i]
- odd_i := odd_i + 1
- nums[index] を 2 で割った余りが 0 の場合(偶数の場合)
- nums を返す
実装例
それでは、実際のコードを見ながら理解を深めましょう。
class Solution:
def solve(self, nums):
evens = [num for num in nums if num % 2 == 0]
odds = [num for num in nums if num % 2 != 0]
evens.sort()
odds.sort(reverse=True)
even_i = 0
odd_i = 0
for index in range(len(nums)):
if nums[index] % 2 == 0:
nums[index] = evens[even_i]
even_i += 1
else:
nums[index] = odds[odd_i]
odd_i += 1
return nums
ob = Solution()
print(ob.solve([9, 14, 12, 91, -4, 5]))
入力
[9, 14, 12, 91, -4, 5]
出力
[91, -4, 12, 9, 14, 5]
コードの解説
まず、リスト内包表記を使って偶数と奇数をそれぞれ別のリストに振り分けます。続いて、偶数リストは sort() メソッドで昇順に、奇数リストは sort(reverse=True) で降順にソートします。
その後、元のリストを先頭から順に走査し、各要素が偶数か奇数かを判定します。偶数であればソート済みの偶数リストから先頭の値を取り出して元の位置に代入し、奇数であれば同様に奇数リストから値を取り出します。この処理により、偶数と奇数それぞれの相対的な位置関係を保ったまま、条件どおりの並べ替えが完成します。
-
Pythonで奇数桁と偶数桁の合計の差を判定するプログラム
この記事では、与えられた問題を解決するための解法とアプローチについて詳しく解説します。 問題文 整数が1つ与えられたとき、奇数桁の合計と偶数桁の合計の差が0であるかどうかを判定する必要があります。 素朴なアプローチ(ブルートフォース) 最も単純な方法は、数値を構成するすべての偶数桁と奇数桁の合計をそれぞれ計算し、その差を求めることです。しかし、この方法では各桁を順番に処理するため、桁数に比例した計算時間が必要になります。 効率的なアプローチ:11の倍数判定を活用 計算時間を削減するために、「暗算の数学」でよく知られている性質を利用します。それは「ある整数の奇数桁の合計と偶数桁の合計の差が0にな
-
タプルを任意のキーで昇順にソートするPythonプログラム
タプルのリストが与えられたとき、任意の要素(キー)を基準として昇順に並べ替えることを考えます。この処理にはPython組み込みのsorted()関数を使用し、key引数に「どのインデックスの値で比較するか」を返す関数を渡すことで、指定したキーに従ったソートを実現します。 例 入力: A = [(2, 55), (1, 20), (4, 40), (2, 30)] k = 0 出力: [(1, 20), (2, 30), (2, 55), (4, 40)] この例では、各タプルの0番目(先頭)の要素をキーとして昇順にソートしています。その結果、先頭の値が小さい順にタプルが並べ替え