Pythonのcollections.Counterでアナグラム(並べ替え単語)を判定する方法
同じ文字を含みながら、文字の並び順が異なる2つの文字列は「アナグラム」と呼ばれます。たとえば「spot」と「post」は、まったく同じ字母で構成されているため、互いにアナグラムの関係にあります。
この記事では、Pythonの標準ライブラリであるcollectionsモジュールに含まれるCounter()関数を使って、2つの文字列がアナグラムかどうかを判定する方法を解説します。
collections.Counterとは?
collectionsモジュールは、リスト・辞書・セット・タプルといったデータのコレクションを効率的に扱うためのツールを提供します。その中のCounter()は、コレクション内に各要素が何回出現するかを数え上げ、「要素とその出現回数」を対応付けた辞書形式のオブジェクトを返す便利な関数です。
この性質を利用すると、判定ロジックは非常にシンプルになります。2つの文字列に含まれる各文字の出現回数が完全に一致していれば、その2つはアナグラムであると判断できるのです。
実装例
以下は、Python 3で動作するサンプルコードです。「top spot」と「pot post」という2つの文字列を比較しています。
from collections import Counter
StringA = 'top spot'
StringB = 'pot post'
# 各文字列の文字カウントを辞書として表示
print(Counter(StringA))
print(Counter(StringB))
# 辞書同士を比較してアナグラムかどうか判定
if Counter(StringA) == Counter(StringB):
print('StringA と StringB はアナグラムです')実行結果
上記のコードを実行すると、次のような結果が出力されます。
Counter({'t': 2, 'o': 2, 'p': 2, 's': 1, ' ': 1})
Counter({'t': 2, 'o': 2, 'p': 2, 's': 1, ' ': 1})
StringA と StringB はアナグラムですポイント解説
- Counterオブジェクト同士は==演算子で直接比較でき、内部のカウント内容が一致すればTrueを返します。
- この例では空白文字も1文字としてカウントされる点に注意してください。空白を無視したい場合は、
string.replace(" ", "")などで事前に除去しておきましょう。 - 大文字と小文字を区別したくない場合は、
string.lower()で統一してから比較するとよいでしょう。
このように、collections.Counterを使えば、ソートやループ処理を書かずとも、わずか数行のコードでアナグラム判定を実装できます。可読性が高くパフォーマンスにも優れた、Pythonらしいアプローチと言えるでしょう。
-
PythonとSeleniumでWhatsAppチャットボットを作る方法
はじめに この記事では、Pythonを使ってWhatsAppのチャットボットを作成する方法を解説します。TwitterやFacebook向けの一般的なチャットボットとは異なり、WhatsAppは運営ポリシーの関係上、プラットフォーム上で直接ボットを動かすことができません。 しかし、SeleniumというPythonの強力なパッケージを使えば、ブラウザの操作を自動化することでこれを実現できます。Seleniumを利用すれば、ブラウザ経由で「WhatsApp Web」を自由に操作できるのです。 必要なもの 準備が必要なのは、主に以下の3点です。 1. Selenium Seleniumはpip
-
PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法
はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c