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

【Python】指定した文字セットから作成できる単語を抽出する方法

はじめに

この記事では、あらかじめ用意された文字セットから作成可能な単語を抽出して出力するPythonプログラムを紹介します。

入力には、次の2つのリストを使用します。

  • 参照用の単語リスト: 候補となる単語が格納されたリスト
  • 文字リスト: 単語を構成するために使用できる文字のリスト

プログラムの仕組み

以下のプログラムでは、2つの関数を定義しています。

  • Possible_Words(): 単語を構成する各文字とその出現回数を辞書形式で返す関数
  • character_set(): 各単語が、指定された文字リストだけを使って構成できるかどうかを判定し、条件を満たす単語を出力する関数

character_set()関数は、各単語について次の手順でチェックを行います。

  1. 単語内のすべての文字が、使用可能な文字リストに含まれているかを確認する
  2. 文字リスト内の該当文字の出現回数が、単語に必要な回数と一致しているかを確認する
  3. 両方の条件を満たした場合のみ、その単語を出力する

サンプルコード

def Possible_Words(character):
    x = {}
    for n in character:
        x[n] = x.get(n, 0) + 1
    return x

def character_set(w, character):
    for char in w:
        value = 1
        m = Possible_Words(char)
        for k in m:
            if k not in character:
                value = 0
            else:
                if character.count(k) != m[k]:
                    value = 0
        if value == 1:
            print(char)

data = ['fat', 'tap', 'day', 'fun', 'man', 'ant', 'bag', 'aim']
words = ['m', 't', 'e', 'd', 'f', 'a', 'p', 'y', 'i']
character_set(data, words)

実行結果

上記のコードを実行すると、以下のような結果が得られます。

fat
tap
day
aim

たとえば「fun」は「u」が文字リストに存在せず、「man」は必要な「n」が足りないため除外され、文字リストだけで完全に構成できる4つの単語だけが出力されます。

まとめ

このように、Pythonでは文字ごとの出現頻度を管理しながら、指定された文字だけで構成される単語を簡単に判定できます。この手法は、スクラブルなどのワードゲームや、アナグラム・文字組み合わせパズルのソルバーなど、さまざまな場面に応用できます。

  1. PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法

    はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c

  2. Pythonの正規表現で単語以外の文字をマッチさせる方法

    正規表現を使って文字列から「単語以外の文字」を取り出したい場合、Pythonのreモジュールに用意されている特殊シーケンス \W を使うのが最も簡単です。\W は、英字・数字・アンダースコア([^a-zA-Z0-9_])以外のすべての文字に一致します。以下のコードでは、指定した文字列から単語以外の文字をすべて抽出し、そのリストを出力しています。コード例import re s = ab5z8d*$&Y@ regx = re.compile(r\W) result = regx.findall(s) print(result)ポイントとして、パターン文字列の先頭に r を付けて raw 文字列に