Pythonで特定の文字列から重複する文字を削除するプログラム
文字列 s が与えられたとします。ここから、すでに一度出現したことのある重複文字をすべて削除する必要があります。ただし、最終的な文字列は元の文字列と同じ文字の出現順序を保たなければなりません。
この問題は、順序付き辞書(OrderedDict)を使って文字の挿入順序を維持することで効率的に解決できます。辞書の値には各文字の出現回数を格納しますが、今回の目的では頻度の値そのものは重要ではありません。辞書が完成したら、キーを順番に取り出して連結するだけで、重複のない文字列が得られます。
例えば、入力が s = "bbabcaaccdbaabababc" の場合、出力は "bacd" になります。
アルゴリズム
- d := キーが挿入順に保存される辞書を作成する
- 文字列 s 内の各文字 c について、以下を繰り返す
- c が d に存在しない場合は d[c] := 0 を設定する
- d[c] := d[c] + 1 として出現回数をカウントする
- キーを挿入順に連結して出力文字列を作成し、返す
実装例
以下のコードで実際の動作を確認してみましょう。
from collections import OrderedDict
def solve(s):
d = OrderedDict()
for c in s:
if c not in d:
d[c] = 0
d[c] += 1
return ''.join(d.keys())
s = "bbabcaaccdbaabababc"
print(solve(s))入力
"bbabcaaccdbaabababc"
出力
"bacd"
補足
なお、Python 3.7 以降では通常の dict も挿入順序を保持することが仕様で保証されているため、OrderedDict を使わずに同じ結果を得ることも可能です。また、この手法の計算量は O(n) であり、文字列の長さに対して線形時間で処理できるため、大きなデータでも高速に動作します。
-
Pythonで文字列から数字以外の文字を削除する方法を解説
Pythonでは、文字列から数字以外の文字(アルファベットや記号など)を取り除く方法がいくつかあります。ここでは、代表的な3つの手法を具体的なコード例とともに紹介します。 1. 内包表記とisdigit()メソッドを使う方法 最もシンプルでPythonらしい書き方は、for ... ifによる内包表記を使って数字以外の文字を除外する方法です。isdigit()メソッドは、文字が数字かどうかを判定してくれます。 >>> s = H3ll0 P30P13 >>> .join(i for i in s if i.isdigit()) 303013 このコードでは
-
Pythonで文字列から特定の文字を削除する方法【replace・正規表現・translate】
replace()メソッドで文字を削除する基本の方法Pythonの文字列(str型)には、部分文字列を別の文字列へ置き換えるためのreplace()メソッドが用意されています。削除したい文字を空文字列()に置き換えることで、その文字を取り除くことができます。>>> Hello people.replace(e, ) Hllo popl正規表現(re.sub)で複数の文字を一度に削除する1行のコードで複数種類の文字をまとめて削除したい場合は、正規表現モジュール re を使うのがおすすめです。削除したい文字を「|」(OR条件)で区切って指定し、re.sub(置換対象パターン, 置