【Python】区切り文字の順序を保ったまま単語だけを逆順に並べ替える方法
問題の概要
文字列と区切り文字(デリミタ)のリストが与えられたとします。このとき、区切り文字同士の相対的な順序はそのまま維持しながら、文字列内の単語だけを逆順に並べ替えるプログラムを作成します。
例えば、入力が以下の場合を考えてみましょう。
- s = "Computer/Network:Internet|tutorialspoint"
- delims = ["/", ":", "|"]
この場合、期待される出力は次のようになります。
tutorialspoint/Internet:Network|Computer
解決のアプローチ
この問題は、以下の手順で解くことができます。
- 単語を格納するための新しいリスト
wordsを用意します。 - 結果を格納するための空文字列
ansを初期化します。 - 区切り文字以外の部分で文字列を分割し、抽出した単語を
wordsリストに追加します。 - 再度文字列を先頭から走査し、文字が区切り文字であればそのまま
ansに追加します。区切り文字以外の場合は、wordsリストの末尾から単語を取り出してansに連結します。 - 最後に
ansを返します。
実装例(Python)
それでは、実際のコードを見てみましょう。ここでは、Python標準ライブラリの itertools.groupby を活用しています。
from itertools import groupby
class Solution:
def solve(self, sentence, delimiters):
words = []
ans = ""
for k, g in groupby(sentence, lambda x: x in delimiters):
if not k:
words.append("".join(g))
for k, g in groupby(sentence, lambda x: x in delimiters):
if k:
ans += "".join(g)
else:
ans += words.pop()
return ans
ob = Solution()
s = "Computer/Network:Internet|tutorialspoint"
delims = ["/", ":", '|']
print(ob.solve(s, delims))
入力
"Computer/Network:Internet|tutorialspoint", ["/", ":", '|']
出力
tutorialspoint/Internet:Network|Computer
コードの解説
このコードでは、groupby 関数を使って文字列を「区切り文字の連続したグループ」と「通常の文字の連続したグループ」に分割しています。
- 最初のループ: 区切り文字ではないグループ(つまり単語)だけを
wordsリストに収集します。 - 2番目のループ: 文字列を再び走査し、区切り文字のグループはそのまま出力に追加します。一方、単語のグループには
words.pop()でリストの末尾から単語を取り出して追加します。
これにより、単語は逆順になりますが、区切り文字の位置と順序は元の文字列のまま保たれるという仕組みです。
ポイント
リストの pop() メソッドはデフォルトで末尾の要素を取り出すため、LIFO(後入れ先出し)として機能します。この特性こそが、「区切り文字はそのままに、単語だけを逆順にする」という要件を実現する鍵となっています。
-
Pythonで有向グラフを反転するプログラムの書き方を解説
有向グラフが与えられたとき、その反転グラフ(逆グラフ)を求めることを考えてみましょう。反転とは、元のグラフにおいて u から v へ向かう辺 を、v から u へ向かう辺 に変える操作です。入力は隣接リスト形式で与えられ、ノード数が n の場合、ノードは 0, 1, ..., n-1 という番号で表されます。例えば、次のようなグラフが入力として与えられた場合:出力は以下のようになります:解法のアルゴリズムこの問題は、以下の手順で解くことができます。頂点数 n と同じ長さの空リスト ans を用意しますグラフの各インデックス i と、それに対応する隣接リスト l について処理を行いますl 内の各
-
文字列の中から偶数の長さの単語を出力するPythonプログラム
本記事では、与えられた問題を解決するための考え方と実装方法について解説します。Pythonの基本的な文字列操作を組み合わせることで、初心者の方でも簡単に実装できる内容となっています。 問題文 文字列が与えられたとき、その中に含まれる単語のうち、文字数が偶数であるものをすべて画面に表示するプログラムを作成します。 例えば、「tutorial point」という文字列が入力された場合、「tutorial」は8文字(偶数)なので出力され、「point」は5文字(奇数)なので出力されません。 解決のアプローチ この問題は、以下の手順で解決できます。 split()関数を使って、入力文字列を空白区切り