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

【Python】偶数インデックスと奇数インデックスの要素を入れ替える方法

問題の概要

数値のリスト nums が与えられたとき、偶数インデックス(0, 2, 4, ...)に位置する要素同士、および奇数インデックス(1, 3, 5, ...)に位置する要素同士を、それぞれ2個ずつペアとして入れ替えることを考えます。

たとえば、入力が [1,2,3,4,5,6,7,8,9] の場合、出力は [3, 4, 1, 2, 7, 8, 5, 6, 9] になります。インデックス0と2、1と3、4と6、5と7の要素がそれぞれ入れ替わっているのがわかります。

解法のアプローチ

この問題は、以下の手順で解くことができます。

  • まず、リスト nums の長さを取得します。
  • インデックス i を 0 から開始し、4 ずつ増やしながらリストの末尾までループします。
  • i + 2 がリストの範囲内であれば、nums[i]nums[i+2](偶数インデックス同士)を交換します。
  • i + 3 がリストの範囲内であれば、nums[i+1]nums[i+3](奇数インデックス同士)を交換します。
  • 最後に、処理済みのリスト nums を返します。

ステップ幅を 4 にしているのは、1回のループで偶数・奇数それぞれのペア(合計4要素)をまとめて処理するためです。これにより、すべての要素を重複なく効率よく入れ替えられ、計算量は O(n) に収まります。

実装例

理解を深めるために、以下の実装を見てみましょう。

class Solution:
    def solve(self, nums):
        length = len(nums)
        for i in range(0, length, 4):
            if(i+2 < length):
                nums[i], nums[i+2] = nums[i+2], nums[i]
            if(i+3 < length):
                nums[i+1], nums[i+3] = nums[i+3], nums[i+1]
        return nums

ob = Solution()
nums = [1,2,3,4,5,6,7,8,9]
print(ob.solve(nums))

入力

[1,2,3,4,5,6,7,8,9]

出力

[3, 4, 1, 2, 7, 8, 5, 6, 9]

動作の流れを確認

入力 [1,2,3,4,5,6,7,8,9] の場合、処理は次のように進みます。

  • i = 0 のとき: nums[0]nums[2] を交換(1 ⇔ 3)、続いて nums[1]nums[3] を交換(2 ⇔ 4)→ [3, 4, 1, 2, 5, 6, 7, 8, 9]
  • i = 4 のとき: nums[4]nums[6] を交換(5 ⇔ 7)、続いて nums[5]nums[7] を交換(6 ⇔ 8)→ [3, 4, 1, 2, 7, 8, 5, 6, 9]
  • i = 8 のとき: i + 2i + 3 もリストの範囲外のため、何も行いません。

この結果、最終的な出力は [3, 4, 1, 2, 7, 8, 5, 6, 9] となり、期待どおりの並び順が得られます。なお、Pythonでは a, b = b, a というタプル代入を使うことで、一時変数なしに簡潔に要素を交換できる点もポイントです。

  1. Pythonでリスト内の偶数と奇数をカウントする3つの方法を解説

    この記事では、リスト内に含まれる偶数と奇数の個数を数える方法について、具体的なコード例とともに解説します。問題の概要課題: 与えられたリストの中から、偶数と奇数がそれぞれいくつ含まれているかをカウントします。ここでは、以下の3つのアプローチを紹介します。それぞれ特徴が異なるため、用途やコードの可読性に応じて使い分けるのがおすすめです。方法1:forループを使った基本的な方法(総当たり方式)最もシンプルで直感的な方法です。拡張forループで各要素を順番に確認し、2で割った余りによって偶数か奇数かを判定します。コード例list1 = [21, 3, 4, 6, 33, 2, 3, 1, 3, 76

  2. Pythonで奇数桁と偶数桁の合計の差を判定するプログラム

    この記事では、与えられた問題を解決するための解法とアプローチについて詳しく解説します。 問題文 整数が1つ与えられたとき、奇数桁の合計と偶数桁の合計の差が0であるかどうかを判定する必要があります。 素朴なアプローチ(ブルートフォース) 最も単純な方法は、数値を構成するすべての偶数桁と奇数桁の合計をそれぞれ計算し、その差を求めることです。しかし、この方法では各桁を順番に処理するため、桁数に比例した計算時間が必要になります。 効率的なアプローチ:11の倍数判定を活用 計算時間を削減するために、「暗算の数学」でよく知られている性質を利用します。それは「ある整数の奇数桁の合計と偶数桁の合計の差が0にな