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

【Python入門】2つの文字列から珍しい単語(ユニークな単語)を見つけるプログラムの作り方

はじめに

この記事では、以下の問題文に対する解決方法を、実際のコード例とともにわかりやすく解説します。

問題文

2つの文字列が与えられたとき、その中から「珍しい単語」(どちらか一方の文字列にしか出現しない単語)をすべて抽出することを目標とします。両方の文字列に共通して含まれる単語は除外します。

解決のアプローチ

ここでは辞書(dict)を使った出現回数のカウント方式を採用します。手順は次のとおりです。

  1. 空の辞書を用意する
  2. 各文字列をsplit()で単語ごとに分割する
  3. 各単語の出現回数を辞書に記録する
  4. 出現回数がちょうど1回の単語だけを結果として返す

実装例

# 珍しい単語を見つける関数
def find(A, B):
    # 出現回数を記録する辞書
    count = {}
    # 文字列Aの単語を登録
    for word in A.split():
        count[word] = count.get(word, 0) + 1
    # 文字列Bの単語を登録
    for word in B.split():
        count[word] = count.get(word, 0) + 1
    # 出現回数が1回だけの単語を返す
    return [word for word in count if count[word] == 1]

# メイン処理
A = "Tutorials point "
B = "Python on Tutorials point"
print("文字列の中の珍しい単語:", find(A, B))

実行結果

文字列の中の珍しい単語: ['Python', 'on']

コードの解説

count.get(word, 0) + 1という書き方は、辞書にキーが存在しない場合にデフォルト値0を返すget()メソッドを活用したテクニックです。これにより、キーの存在確認をせずに出現回数を安全にインクリメントできます。

最後の行ではリスト内包表記を使い、出現回数が1回である単語だけを新しいリストとして取り出しています。すべての変数は関数内のローカルスコープで宣言されるため、外部への影響もありません。

別のアプローチ:Counterや集合演算を使う

より簡潔に書きたい場合は、標準ライブラリのcollections.Counterを利用する方法もあります。

from collections import Counter

def find(A, B):
    c = Counter(A.split()) + Counter(B.split())
    return [word for word in c if c[word] == 1]

また、重複がなければ集合の対称差(^演算子)を使うという選択肢もあります。

def find(A, B):
    return list(set(A.split()) ^ set(B.split()))

ただし、この方法では元の順序が保持されない点に注意してください。

まとめ

この記事では、2つの文字列から珍しい単語を見つけるPythonプログラムの作成方法を学びました。基本的な辞書によるカウント方式に加えて、Counterや集合演算を使ったより簡潔な実装方法も紹介しました。状況に応じて最適な手法を選択できるようにしておきましょう。

  1. Pythonで数値が2の累乗かどうかを判定するプログラム

    この記事では、以下の問題に対する解決策について詳しく解説します。 問題文 ある整数が与えられたとき、その数が2の累乗であるかどうかを判定する必要があります。 この問題は、主に次の2つのアプローチで解くことができます。 アプローチ1: 繰り返し2で割って判定する 数値を順に2で割っていき、途中で割り切れなくなった場合(奇数が出現した場合)は2の累乗ではありません。最終的に1に到達できれば、その数は2の累乗であると判定できます。なお、0は2の累乗に含まれないため、あらかじめ除外しています。この方法の時間計算量は O(log n) です。 サンプルコード # power of 2 def find(

  2. Pythonで数値が2の累乗かどうかを判定するプログラム

    本記事では、与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法について、考え方と実装手順をわかりやすく解説します。 問題の定義 ある整数 n が与えられたとき、その数が2の累乗(1, 2, 4, 8, 16, …)であるかどうかを判定します。 アプローチ 判定には「繰り返し2で割る」というシンプルな方法を使います。考え方は以下の通りです。 入力された数値 n を、1になるまで繰り返し2で割っていきます(n = n // 2)。 割る過程で n % 2 の結果が0以外(奇数)になり、かつ n が1でない場合は、その数は2の累乗ではありません。 最終的に n がちょうど1になれば、そ