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

【Python】リスト内包表記とOrderedDictでK番目の非繰り返し文字を取得する方法

この記事では、リスト内包表記OrderedDictを活用して、Pythonで文字列の中から「K番目の非繰り返し文字」を取得する方法を解説します。非繰り返し文字とは、その文字列内で一度だけ出現する文字のことです。実装には、Pythonに標準で用意されている構造を利用します。

アルゴリズムの流れ

処理の手順は以下の4ステップです。

1. 入力文字列から辞書データを作成する。
2. 各文字の出現頻度をカウントする。
3. 出現回数が1回であるキーだけを抽出したリストを作成する。
4. そのリストから(k-1)番目の文字を返す。

コード例

以下が実際の実装例です。OrderedDictは要素の挿入順序を保持できるため、元の文字列における文字の出現順序が維持されるのがポイントです。

from collections import OrderedDict
import itertools
def kthRepeating(inp,k):
    # 入力文字列から辞書データを作成
    dict=OrderedDict.fromkeys(inp,0)
    # 各文字の出現頻度をカウント
    for ch in inp:
        dict[ch]+=1
    # 出現回数が1回のキーだけを抽出
    nonRepeatDict = [key for (key,value) in dict.items() if value==1]
    # (k-1)番目の文字を返す
    if len(nonRepeatDict) < k:
        return 'no ouput.'
    else:
        return nonRepeatDict[k-1]
# ドライバー関数
if __name__ == "__main__":
    inp = "tutorialspoint"
    k = 3
    print (kthRepeating(inp, k))

コードのポイント

OrderedDict.fromkeys(inp, 0)により、各文字をキー・初期値0とした順序付き辞書を一括生成しています。続くループで文字列を走査しながら出現回数を加算し、最後にリスト内包表記を使って「値が1(=1回のみ出現)の文字」だけを効率よく取り出しています。条件分岐により、非繰り返し文字がk個未満の場合はメッセージを返す仕様になっている点も実務的です。

実行結果

入力文字列 "tutorialspoint" において1回だけ出現する文字は、出現順に「u」「r」「a」「l」「s」「p」「n」です。k=3を指定しているため、3番目の非繰り返し文字が出力されます。

a

まとめ

この記事では、リスト内包表記とOrderedDictを組み合わせることで、文字列内のK番目の非繰り返し文字を簡潔かつ効率的に取得する方法を紹介しました。OrderedDictが出現順序を保持してくれるおかげで、余計なソート処理なしに直感的なコードで目的の結果を得られるのが大きなメリットです。文字列解析や頻度カウントの処理に応用できるテクニックなので、ぜひ覚えておきましょう。

  1. Pythonのリストをスタックとキューとして使う方法を徹底解説

    本記事では、Python 3.x(およびそれ以前のバージョン)におけるスタック(Stack)とキュー(Queue)という基本的なデータ構造について解説します。それぞれのデータ構造の仕組みや操作方法を、実際のコード例とともにわかりやすく学んでいきましょう。 本記事で扱う主なトピックは以下の通りです。 挿入操作(Push / Enqueue) 削除操作(Pop / Dequeue) 表示・走査(トラバース)操作 前提知識:リストとリスト操作の基礎関連するデータ構造:リスト操作 スタック(Stack)とは スタックでは、オブジェクトが積み重なるように格納され、取り出す際には到着した順序とは逆の順

  2. PythonでWindowsの隠しファイルとディレクトリを一覧表示する方法

    Unix系OS(macOS、Linuxなど)では、隠しファイルは「.」(ドット)で始まるという規則があるため、startswithによる簡単なチェックだけでフィルタリングできます。一方、Windowsの場合は、ファイルに設定された属性を確認し、その属性から隠しファイルかどうかを判定する必要があります。 サンプルコード 例えば、以下のコードを実行すると、隠しファイルを除外したファイル一覧を取得できます。 import os if os.name == nt: import win32api, win32con def file_is_hidden(p): if os.name