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

Pythonでリストと辞書を使ってアナグラムを見つけて出力する方法

このチュートリアルでは、リスト辞書を使ってアナグラム(同じ文字で構成された別の単語)を見つけ、出力するプログラムを作成します。なお、一つの問題へのアプローチは複数あります。まずはこのチュートリアルに頼らず、自分でコードを書いてみることをおすすめします。ロジックのアイデアが浮かばない場合は、以下の手順に従って進めてください。

アナグラムとは

アナグラムとは、同じ文字を並べ替えて作られる別の単語やフレーズのことです。たとえば「listen」と「silent」は、使用している文字が完全に一致しているため、互いにアナグラムの関係にあります。

アルゴリズム

全体の流れは以下の通りです。

1. 文字列のリストを初期化する。
2. 空の辞書を初期化する。
3. 文字列のリストを反復処理する。
    3.1. 文字列をソートし、その結果が辞書のキーとして存在するか確認する。
        3.1.1. キーがすでに存在する場合は、元の文字列をそのキーのリストに追加する。
    3.2. 存在しない場合は、ソート済み文字列をキーとして空のリストを登録し、元の文字列を追加する。
4. 空の文字列を初期化する。
5. 辞書の項目を反復処理し、すべての値を空の文字列に連結する。
6. 結果の文字列を出力する。

ポイントは、「文字をソートすると、アナグラム同士は必ず同じ文字列になる」という性質を利用することです。これにより、ソート結果を辞書のキーとして使えば、アナグラムのグループ分けが簡単に行えます。

コード例

それでは、上記のアルゴリズムを実際のコードにしてみましょう。

## 文字列のリストを初期化
strings = ["apple", "orange", "grapes", "pear", "peach"]

## 空の辞書を初期化
anagrams = {}

## リスト内の各文字列を反復処理
for string in strings:
    ## 文字列をソートしてキーを作成
    key = "".join(sorted(string))

    ## キーが辞書に存在するかどうかを確認
    if key in anagrams.keys():
        ## 既存のキーに元の文字列を追加
        anagrams[key].append(string)
    else:
        ## キーに空のリストを割り当てて追加
        anagrams[key] = []
        anagrams[key].append(string)

## 結果用の空の文字列を初期化
result = ""

## 辞書を反復処理して値を連結
for key, value in anagrams.items():
    result += "".join(value) + " "

## 結果を出力
print(result)

コードの解説

重要なのは key = "".join(sorted(string)) の部分です。たとえば「apple」をソートすると「aelpp」になり、「pear」は「aepr」、「peach」は「acehp」になります。このソート済み文字列をキーにすることで、同じ文字構成を持つ単語が自動的に同じグループにまとめられます。

また、キーの存在確認では if key in anagrams.keys() のように、ソート後のキーを比較対象にする必要があります。元の文字列ではなくソート済みのキーで判定しないと、グループ化が正しく機能しないので注意しましょう。

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

apple orange grapes pear peach

このサンプルデータには互いにアナグラムの関係にある単語が含まれていないため、すべての単語がそれぞれ独立したグループとして順番に出力されています。試しに「listen」や「silent」など、アナグラムの関係にある単語をリストに追加して実行すると、同じキーにまとめられている様子を確認できます。

まとめ

今回は、リストと辞書を組み合わせてアナグラムを検出・出力する方法を学びました。「文字列をソートしてキー化する」というシンプルな発想が、グループ分けの鍵となります。このチュートリアルについてご不明な点がある場合は、ぜひコメント欄でお知らせください。

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

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

  2. Pythonで配列リスト内の0と1を分離する方法

    リスト内包表記(List Comprehension)はPythonで広く使われている人気のテクニックです。ここでは、この手法を活用して配列内の0と1を分離してみましょう。 まず、ユーザーから入力を受け取って配列を作成します。配列の要素は0と1がランダムな順序で含まれているものとします。そして、0を配列の左側へ、1を右側へと分離させます。 具体的には、配列を走査しながら要素を2つの異なるリストに振り分けます。片方のリストには0だけを、もう片方のリストには1だけを格納し、最後にその2つのリストを連結することで目的の結果を得られます。 実行例 入力: a=[0,1,1,0,0,1] 出力: [0