Pythonでオブジェクトが文字列かどうかを判定する方法(Python 2.x / 3.x対応)
Pythonでオブジェクトが文字列型かどうかを確認する方法
Pythonでは、オブジェクト obj が文字列型、またはそのサブクラスのインスタンスであるかどうかを判定したい場面がよくあります。使用しているPythonのバージョンによって適切な書き方が異なるため、ここではPython 2.xと3.xそれぞれの方法を解説します。
Python 2.x の場合
オブジェクトが文字列型、またはそのサブクラスであるかを確認するには、basestring を使います。
isinstance(obj, basestring)
これは、str と unicode の両方が basestring のサブクラスであるためです。この方法なら、バイト文字列とユニコード文字列のどちらでもまとめて判定できます。
str 型のみを判定したい場合:
obj が str 型、またはそのサブクラスのインスタンスであるかどうかを確認するには、次のように記述します。
isinstance(obj, str)
unicode 文字列のみを判定したい場合:
obj がユニコード文字列(unicode)のインスタンスであるかどうかを確認するには、次のようにします。
isinstance(obj, unicode)
Python 3.x の場合
Python 3では文字列の扱いが統一され、unicode 型や basestring 型は廃止されました。そのため、以下のコードだけで十分です。
isinstance(obj, str)
Python 3.xでは、すべての文字列は str 型として扱われるため、この1行でユニコード文字列も含めて判定できます。
補足:より厳密に型を判定したい場合
isinstance() はサブクラスのインスタンスも True と返すため、「正確に文字列型そのものであること」を厳密にチェックしたい場合は type() を使う方法もあります。
type(obj) is str
ただし、通常は継承関係を考慮した isinstance() の使用が推奨されています。なお、Python 2は2020年にサポートが終了しているため、新規開発ではPython 3.x向けの isinstance(obj, str) を使うのが標準的なアプローチです。
-
Pythonで文字列内の回文ボーダー(回文境界)を検出するプログラム
問題の概要ある文字列 str が与えられているとします。文字列における「ボーダー(境界)」とは、その文字列の真の接頭辞かつ接尾辞となっている部分文字列のことを指します。たとえば、「ab」は文字列「ababab」のボーダーです。さらに、このボーダー自体が回文である場合、それを「回文ボーダー」と呼びます。ここで、与えられた文字列 str に含まれる回文ボーダーの個数を f(str) と定義します。求めたいのは、str のすべての空でない部分文字列 str_k に対する f(str_k) の総和です。この合計値は非常に大きくなる可能性があるため、109 + 7 で剰余を取って計算します。具体例入力が
-
直方体を一刀で切断!切り分けられたキューブの数を求めるPythonプログラム
問題概要 一辺の長さが a、b、c の単位立方体(キューブ)を組み合わせて、a×b×c の直方体を作ることを考えます。ただし、a、b、c はペアごとに互いに素、すなわち gcd(a, b) = gcd(b, c) = gcd(c, a) = 1 を満たすものとします。 この直方体を、下の図のように頂点 P・Q・R を通る平面でたった一刀で2つに切断します。このとき、断面によって「2つに切り分けられてしまう」単位立方体が何個あるかを求めるのがこの問題です。複数のテストケースが配列として与えられるので、それぞれのケースについて答えを計算して返します。 切断は、頂点 P、Q、R の3点を通る平面