Pythonでリスト内のアナグラムをグループ化する方法を解説
このチュートリアルでは、リストに含まれるすべてのアナグラムをグループ化するプログラムを作成します。まずは、アナグラムとは何かを確認しておきましょう。
アナグラムとは、使用されている文字が同じで、並び順だけが異なる2つの文字列のことを指します。
解決策に入る前に、具体的な例を見てみましょう。
入力例
['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']
出力例
[['cat', 'tac'], ['dog', 'god'], ['fried', 'fired'], ['pat', 'tap']]
この問題は、大きく2つのステップに分けて考えることができます。まず、2つの文字列がアナグラムかどうかを判定する関数を作成します。以下の手順に従ってコードを書いてみましょう。
- 文字列を初期化する。
- 両方の文字列をソートする。
- ソート後の文字列が一致すれば True を返し、そうでなければ False を返す。
サンプルコード
# 2つの文字列がアナグラムかどうかを判定するシンプルなラムダ関数
are_anagrams = lambda x, y: str(sorted(x.lower())) == str(sorted(y.lower()))
# 関数の呼び出し
print(are_anagrams('cat', 'tac'))
print(are_anagrams('cat', 'Tac'))
print(are_anagrams('cat', 'dog'))
実行結果
上記のコードを実行すると、次のような結果が得られます。
True True False
これで、2つの文字列がアナグラムかどうかを判定できるようになりました。しかし、これだけでは元の問題を解くには不十分です。リスト内のすべてのアナグラムを、サブリストとしてグループ化(保存)する必要があります。
では、どのように解けばよいのでしょうか?
要素をグループ化する際には、辞書(dict)を使うのがベストプラクティスです。関連するアナグラムごとに1つのキーを持たせることで、効率的に管理できます。Python初心者の方には少し分かりにくいかもしれませんので、手順を順番に見ていきましょう。
- 文字列のリストを初期化する。
- 空の辞書を初期化する。
- リストを反復処理する。
- 文字列をソートする。
- そのソート済み文字列が辞書に存在するかどうかを確認する。
- 存在する場合は、そのキーのリストに現在の文字列を追加する。
- 存在しない場合は、現在の文字列を含む新しいリストでキーを初期化する。
- 辞書のすべての値をリストとして出力する。
サンプルコード
# 文字列のリストを初期化
anagrams = ['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']
# 空の辞書を初期化
grouped_anagrams = {}
# リストを反復処理してアナグラムをグループ化
for string in anagrams:
# 文字列をソート
sorted_string = str(sorted(string))
# 辞書にキーが存在するか確認
if sorted_string in grouped_anagrams:
# グループに文字列を追加
grouped_anagrams[sorted_string].append(string)
else:
# 現在の文字列で新しいリストを初期化
grouped_anagrams[sorted_string] = [string]
# 辞書の値(アナグラムのグループ)を出力
print(list(grouped_anagrams.values()))
実行結果
上記のコードを実行すると、次のような結果が得られます。
[['dog', 'god'], ['pat', 'tap'], ['cat', 'tac'], ['fired', 'fried']]
まとめ
この問題は、今回紹介した以外にもさまざまなアプローチで解くことができます。たとえば、defaultdict というデータ構造を使うと、キーが辞書に存在するかどうかのチェックを省略でき、コードをより簡潔にできます。ぜひ調べて、自分のコードに取り入れてみてください。
このチュートリアルについて不明な点がある場合は、コメント欄でお気軽にお尋ねください。
-
Pythonでリストからバイグラム(Bigram)を生成する方法
バイグラム(bigram)とは、文章中の連続する2つの単語をペアとして組み合わせたものです。Pythonでは、この手法がテキスト分析の分野で広く活用されています。本記事では、与えられた文からバイグラムを生成する2つのアプローチを紹介します。 enumerate()とsplit()を使う方法 まずsplit()メソッドで文を単語に分割し、その後enumerate()関数を使って隣接する単語同士をペアにしていきます。インデックス番号を利用することで、各単語とその次の単語を効率的に組み合わせられるのがポイントです。 サンプルコード list = [Stop. look left right. go]
-
Pythonで文字列をアナグラムごとにグループ化する方法
問題の概要複数の文字列が与えられたとき、それらをアナグラム(並べ替えると同じ文字になる単語)ごとにグループ化する問題を考えてみましょう。例えば、入力が [eat, tea, tan, ate, nat, bat] の場合、出力は次のようなグループになります。[[ate,eat,tea],[nat,tan],[bat]]「eat」「tea」「ate」は同じ3文字を含むため同じグループに、「tan」と「nat」も同様にグループ化され、「bat」は対応する単語がないため単独のグループになります。解決のアプローチこの問題は、以下の手順で効率的に解くことができます。結果を格納するための辞書(マップ)re