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

Pythonで文字列内の各文字の出現頻度がすべて異なるかどうかを確認する方法

この記事では、Pythonを使って与えられた文字列の中に含まれる各文字の出現頻度(カウント)を求める方法を解説します。さらに、その頻度の中に同じ値を持つ文字が2つ以上存在するかどうか、つまり「すべての文字の頻度が互いに異なっているか」どうかを判定する方法まで紹介します。

処理は大きく2つのステップに分けて行います。まず最初のプログラムでは、単純に各文字の頻度を数えるところから始めましょう。

ステップ1:各文字の出現頻度を数える

ここでは、入力された文字列に含まれる各文字の出現回数を調べます。まず空の辞書(dict)を用意し、文字列を1文字ずつ走査しながら、その文字がすでに辞書のキーとして存在する場合はカウントを1つ増やし、存在しない場合は新しくキーとして登録して値を1にします。これにより、「文字をキー、出現回数を値」とするキー・バリューのペアが自然に構築されていきます。

サンプルコード

in_string = "She sells sea shells"
dic1 = {}
for k in in_string:
    if k in dic1.keys():
        dic1[k] += 1
    else:
        dic1[k] = 1
print(dic1)
for k in dic1.keys():
    print(k, " repeats ", dic1[k], " time's")

実行結果

上記のコードを実行すると、次のような出力が得られます。

{'S': 1, 'h': 2, 'e': 4, ' ': 3, 's': 5, 'l': 4, 'a': 1}
S repeats 1 time's
h repeats 2 time's
e repeats 4 time's
  repeats 3 time's
s repeats 5 time's
l repeats 4 time's
a repeats 1 time's

この結果から、たとえば「e」と「l」はどちらも4回出現しており、同じ頻度を持つ文字が複数存在することがわかります。大文字の「S」と小文字の「s」は別の文字として扱われている点にも注意してください。

ステップ2:頻度がすべて異なるかどうかを判定する

次に、上記のプログラムを拡張して、各文字の頻度がすべて一意(ユニーク)であるかどうかを確認します。考え方はシンプルで、頻度の値を集合(set)に変換し、その要素数を調べます。集合は重複した値を自動的に取り除くため、もし一意な頻度の数が1より大きければ、同じ頻度を持つ文字が複数存在することになります。逆に、一意な頻度の数がちょうど1であれば、すべての文字が同じ回数だけ出現していることになります。

サンプルコード

in_string = "She sells sea shells"
dic1 = {}
for k in in_string:
    if k in dic1.keys():
        dic1[k] += 1
    else:
        dic1[k] = 1
print(dic1)
u_value = set(val for udic in dic1 for val in (dic1.values()))
print("Number of Unique frequencies: ", len(u_value))
if len(u_value) == 1:
    print("All character have same frequiency")
else:
    print("The characters have different frequencies.")

実行結果

上記のコードを実行すると、次のような出力が得られます。

{'S': 1, 'h': 2, 'e': 4, ' ': 3, 's': 5, 'l': 4, 'a': 1}
Number of Unique frequencies: 5
The characters have different frequencies.

この例では、頻度の値は {1, 2, 3, 4, 5} の5種類に整理されました。一意な頻度の数が5(1より大きい)であるため、「文字ごとの頻度は互いに異なるものもあれば重複もある」という結論、すなわちすべての文字が同じ頻度ではないと判定されます。

補足:collections.Counterを使った簡潔な書き方

標準ライブラリの collections.Counter を使うと、頻度カウントの処理をより簡潔に書くこともできます。

from collections import Counter

in_string = "She sells sea shells"
cnt = Counter(in_string)
print(cnt)

unique_freq = set(cnt.values())
if len(unique_freq) == 1:
    print("すべての文字は同じ頻度です")
else:
    print("文字ごとの頻度は異なります")

この方法では、手動で辞書を操作するループが不要になり、コードの可読性と保守性が向上します。用途に応じて、素の辞書を使う方法とCounterを使う方法を使い分けるとよいでしょう。

  1. 【Python】文字列がすべてユニークな文字で構成されているか判定する方法

    本記事では、与えられた文字列に含まれる文字がすべて一意(ユニーク)であるかどうかを判定するPythonプログラムについて、その解法とアプローチをわかりやすく解説します。 問題の概要 文字列が入力として与えられたとき、その文字列に含まれるすべての文字が重複なく一意であるかどうかを判定します。たとえば「abcde」はすべて異なる文字で構成されているためTrue、「tutorialspoint」のように同じ文字が複数回出現する場合はFalseとなります。 アプローチ この問題は、以下のような手順で効率的に解くことができます。 ブール値の配列を用意する: 各インデックス i が「アルファベット(AS

  2. Pythonで文字列内の重複文字をすべて検索する方法を解説

    このチュートリアルでは、Pythonを使って文字列内に含まれるすべての重複文字を見つける方法を学びます。Pythonには複数のアプローチがあるので、それぞれ順番に見ていきましょう。 今回作成するプログラムの目的は、文字列の中に存在する重複した文字を抽出することです。例えば、文字列 tutorialspoint を入力すると、プログラムは t o i を出力します。つまり、文字列内で出現回数が2回以上の文字をすべて見つける、という処理になります。それでは始めましょう。 モジュールを使わずに書くプログラム 外部モジュールを一切使わず、Python標準の機能だけで目的を達成する方法を紹介します。まず