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

Pythonで2つの文字列を交互にマージする方法を解説

2つの文字列 st があるとします。これらを、s の文字から始めて交互に1文字ずつ取り出しながら結合(マージ)することを考えます。もし2つの文字列の長さが異なる場合は、余った文字をそのままマージ後の文字列の末尾に追加します。

例えば、入力が s = "major"t = "general" の場合、出力は mgaejnoerral になります。t の方が長いため、余りの部分である ral が末尾に追加されるためです。

解決の手順

この問題は、以下のステップで解決できます。

  • インデックス ij をそれぞれ 0 で初期化する

  • 結果を格納する空の文字列 result を用意する

  • is の長さ未満かつ jt の長さ未満の間、以下を繰り返す

    • results[i]t[j] を順に連結する

    • ij をそれぞれ1つ進める

  • is の長さ未満の間、results[i] を連結し、i を進める

  • jt の長さ未満の間、resultt[j] を連結し、j を進める

  • result を返す

それでは、実際の実装例を見てみましょう。

実装例

def solve(s, t):
    i = j = 0
    result = ""
    while i < len(s) and j < len(t):
        result += s[i] + t[j]
        i += 1
        j += 1
    while i < len(s):
        result += s[i]
        i += 1
    while j < len(t):
        result += t[j]
        j += 1
    return result

s = "major"
t = "general"
print(solve(s, t))

入力

"major", "general"

出力

mgaejnoerral

より簡潔な書き方:itertools.zip_longest を活用

Pythonの標準ライブラリ itertools.zip_longest を使うと、同じ処理をより短くエレガントに記述できます。この関数は、長い方の文字列に合わせて要素を組み合わせ、足りない部分を指定した値(デフォルトでは空文字)で埋めてくれます。

from itertools import zip_longest

def solve(s, t):
    return "".join(a + b for a, b in zip_longest(s, t, fillvalue=""))

s = "major"
t = "general"
print(solve(s, t))  # mgaejnoerral

どちらの方法でも計算量は O(n + m)(n、m は各文字列の長さ)となり、効率的に動作します。ループの挙動を理解したい場合は前者の実装、コードの簡潔さを重視する場合は zip_longest を使った後者の実装がおすすめです。

  1. Pythonでマージソートを実装する方法を徹底解説!サンプルコード付き

    この記事では、マージソート(Merge Sort)のアルゴリズムを使って配列を並べ替えるPythonプログラムについて、実際のコード例を交えながら詳しく解説します。 問題設定 課題 − 与えられた配列を、マージソートの考え方を用いて昇順に並べ替えます。 マージソートは分割統治法に基づく整列アルゴリズムです。まず配列を半分ずつ再帰的に分割し、要素が1つになった時点でそれを「ソート済み」とみなします。その後、隣り合う部分配列同士を先頭から比較しながら統合(マージ)していくことで、最終的に配列全体が整列されます。 Pythonでの実装例 # マージ関数 def merge(arr, l, m,

  2. 【Python】再帰を使わない反復型(ボトムアップ)マージソートの実装方法を解説

    この記事では、反復処理(イテレーション)のみでマージソートを実装する方法について解説します。再帰呼び出しを使わずに、whileループだけで配列を整列させる「ボトムアップ方式」のアプローチを見ていきましょう。 問題文 問題: 与えられた配列を、反復処理によるマージソートの考え方を用いて昇順に並べ替えてください。 例として、次の整数配列を扱います。 a = [2, 5, 3, 8, 6, 5, 4, 7] 反復マージソートの考え方 通常のマージソートは再帰を使って配列を分割しますが、反復版では最初から要素数1の部分配列として捉え、隣接する部分配列同士を統合(マージ)しながらサイズを倍々に増やしてい