1. ホーム
  2. python

Pythonで文字列が1文字からなることを効率的にチェックする方法

2023-11-05 11:51:40

質問

文字列 s が一文字だけからなることを確認する効率的な方法は何ですか? 'A' ? のように all_equal(s, 'A') のようなもので、このような挙動になります。

all_equal("AAAAA", "A") = True

all_equal("AAAAAAAAAAA", "A") = True

all_equal("AAAAAfAAAAA", "A") = False

2つの一見非効率的な方法は、まず文字列をリストに変換して各要素をチェックする、または2番目に正規表現を使用することです。もっと効率的な方法があるのでしょうか、それともこれらがPythonでできる最善の方法なのでしょうか? ありがとうございます。

どのように解決するのですか?

これは圧倒的に高速で、たとえ count() で時間を計って、その優れた mgilson's タイミングスイート :

s == len(s) * s[0]

ここでは、すべてのチェックはPythonのCコード内で行われています。

  • len(s)文字を割り当てる。
  • は最初の文字でスペースを埋めます。
  • 2つの文字列を比較します。

文字列が長ければ長いほど、タイムボーナスは大きくなります。ただし、mgilsonが書いているように、文字列のコピーを作成するので、文字列の長さが何百万シンボルにもなる場合は、問題になる可能性があります。

タイミング結果からわかるように、一般的にタスクを解決する最速の方法は、各シンボルに対してPythonのコードを実行しないことです。しかし set() ソリューションもPythonライブラリのCコード内ですべての作業を行いますが、それでも遅いのは、おそらくPythonオブジェクトインターフェイスを通して文字列を操作しているためです。

UPDです。 空文字列の場合について。これをどうするかは、タスクに強く依存します。タスクが "文字列内のすべてのシンボルが同じかどうかをチェックする" である場合。 s == len(s) * s[0] は有効な答えです(シンボルがない場合はエラー、例外はOKです)。タスクが "一意な記号がちょうど1つあるかどうかをチェックする" である場合、空の文字列は偽を与えるはずで、答えは次のようになります。 s and s == len(s) * s[0] または bool(s) and s == len(s) * s[0] のように、ブーリアン値を受け取ることができます。最後に、タスクを "異なるシンボルがないかをチェックする" と理解すると、空の文字列に対する結果は True であり、答えは not s or s == len(s) * s[0] .