回答:
in
演算子を使用できます:
if "blah" not in somestring:
continue
TypeError: argument of type 'NoneType' is not iterable
in
オペレーターはRabin-Carpアルゴリズムを使用しますか?
部分文字列検索の場合は、を使用できますstring.find("substring")
。
あなたはと少し注意する必要がないfind
、index
とin
彼らは検索をサブストリングされているように、しかし。つまり、これは:
s = "This be a string"
if s.find("is") == -1:
print("No 'is' here!")
else:
print("Found 'is' in the string.")
それは印刷しFound 'is' in the string.
、同様if "is" in s:
に評価されますTrue
。これは必要な場合とそうでない場合があります。
if ' is ' in s:
戻るFalse
ことです。
\bis\b
(単語の境界)の大文字と小文字を区別しない正規表現検索をお勧めします。
' is '
、特に、それがキャッチしないであろう、This is, a comma'
またはを'It is.'
。
s.split(string.punctuation + string.whitespace)
1回でも分割されることを強く疑います。split
以下のようではありませんstrip
/ rstrip
/ lstrip
関数の家族、それだけでその正確な順序で、連続して、それが区切り文字のすべてを見たときに分割します。文字クラスで分割したい場合は、正規表現に戻ります(この時点で、r'\bis\b'
分割せずに検索する方が簡単で高速な方法です)。
'is' not in (w.lower() for w in s.translate(string.maketrans(' ' * len(string.punctuation + string.whitespace), string.punctuation + string.whitespace)).split()
-わかりました。これはとんでもないことです
Pythonには文字列を含む部分文字列メソッドがありますか?
はい。ただし、Pythonには比較演算子があり、代わりに使用する必要があります。これは、言語がその使用を意図しており、他のプログラマーが使用することを期待しているためです。そのキーワードはin
であり、比較演算子として使用されます。
>>> 'foo' in '**foo**'
True
元の質問が求める反対(補数)はnot in
次のとおりです。
>>> 'foo' not in '**foo**' # returns False
False
これは意味的には同じnot 'foo' in '**foo**'
ですが、より読みやすく、読みやすさの向上として言語で明示的に提供されています。
__contains__
は避けてくださいfind
index
約束どおり、ここにcontains
メソッドがあります:
str.__contains__('**foo**', 'foo')
を返しますTrue
。スーパーストリングのインスタンスからこの関数を呼び出すこともできます。
'**foo**'.__contains__('foo')
しかし、しないでください。アンダースコアで始まるメソッドは、意味的にプライベートと見なされます。これを使用する唯一の理由は、in
およびnot in
機能を拡張するときです(たとえば、サブクラス化する場合str
):
class NoisyString(str):
def __contains__(self, other):
print('testing if "{0}" in "{1}"'.format(other, self))
return super(NoisyString, self).__contains__(other)
ns = NoisyString('a string with a substring inside')
そしていま:
>>> 'substring' in ns
testing if "substring" in "a string with a substring inside"
True
また、次の文字列メソッドは避けてください。
>>> '**foo**'.index('foo')
2
>>> '**foo**'.find('foo')
2
>>> '**oo**'.find('foo')
-1
>>> '**oo**'.index('foo')
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
'**oo**'.index('foo')
ValueError: substring not found
他の言語では、部分文字列を直接テストするメソッドがない場合があるため、これらのタイプのメソッドを使用する必要がありますが、Pythonでは、in
比較演算子を使用する方がはるかに効率的です。
同じ目標を達成するさまざまな方法を比較できます。
import timeit
def in_(s, other):
return other in s
def contains(s, other):
return s.__contains__(other)
def find(s, other):
return s.find(other) != -1
def index(s, other):
try:
s.index(other)
except ValueError:
return False
else:
return True
perf_dict = {
'in:True': min(timeit.repeat(lambda: in_('superstring', 'str'))),
'in:False': min(timeit.repeat(lambda: in_('superstring', 'not'))),
'__contains__:True': min(timeit.repeat(lambda: contains('superstring', 'str'))),
'__contains__:False': min(timeit.repeat(lambda: contains('superstring', 'not'))),
'find:True': min(timeit.repeat(lambda: find('superstring', 'str'))),
'find:False': min(timeit.repeat(lambda: find('superstring', 'not'))),
'index:True': min(timeit.repeat(lambda: index('superstring', 'str'))),
'index:False': min(timeit.repeat(lambda: index('superstring', 'not'))),
}
そして今、私たちin
は他のものよりも使用がはるかに速いことがわかります。同等の操作を実行するための時間が短いほど良いです:
>>> perf_dict
{'in:True': 0.16450627865128808,
'in:False': 0.1609668098178645,
'__contains__:True': 0.24355481654697542,
'__contains__:False': 0.24382793854783813,
'find:True': 0.3067379407923454,
'find:False': 0.29860888058124146,
'index:True': 0.29647137792585454,
'index:False': 0.5502287584545229}
str.index
とstr.find
?存在するかどうかだけでなく、誰かが部分文字列のインデックスを見つけることを他にどのように提案しますか?(または、containsの代わりにそれらを使用しないようにすることを意味しました- s.find(ss) != -1
代わりに使用しないでss in s
ください?)
re
モジュールのエレガントな使用によってより適切に対処できます。str.indexやstr.findを自分が書いたコードで使用する方法はまだ見つかりません。
str.count
(string.count(something) != 0
)。身震い
operator
モジュールのバージョンはどのように機能しますか?
in_
上記と同じですが、周りにスタックフレームがあるため、それよりも遅くなります:github.com/python/cpython/blob/3.7/Lib/operator.py#L153
if needle in haystack:
@Michaelが言うように、これは通常の使用法です-これはin
演算子に依存しており、メソッド呼び出しよりも読みやすく、高速です。
演算子の代わりにメソッドが本当に必要な場合(たとえばkey=
、非常に奇妙な並べ替えのために奇妙なことをするために...?)、それはです'haystack'.__contains__
。しかし、あなたの例はで使用するためのものなので、あなたif
が言うことを本当に意味しているのではないと思います;-)。特別なメソッドを直接使用するのは良い形式ではありません(読みやすくも効率的でもありません)。これらのメソッドは、代わりに演算子とビルトインを介して使用されることを意図しています。
in
Pythonの文字列とリストここでは、in
メソッドについて自分自身のために話すいくつかの便利な例を示します。
"foo" in "foobar"
True
"foo" in "Foobar"
False
"foo" in "Foobar".lower()
True
"foo".capitalize() in "Foobar"
True
"foo" in ["bar", "foo", "foobar"]
True
"foo" in ["fo", "o", "foobar"]
False
["foo" in a for a in ["fo", "o", "foobar"]]
[False, False, True]
警告。リストは反復可能であり、in
メソッドは文字列だけでなく反復可能に作用します。
["bar", "foo", "foobar"] in "foof"
?
そのため、明らかに、ベクトルごとの比較に類似するものはありません。そうする明白なPythonの方法は次のようになります:
names = ['bob', 'john', 'mike']
any(st in 'bob and john' for st in names)
>> True
any(st in 'mary and jane' for st in names)
>> False
in
、それは要素の線形走査を行い、ゆっくりと比較されているため、リストには使用しないでください。特にメンバーシップテストを繰り返し行う場合は、代わりにセットを使用してください。
使用できますy.count()
。
文字列にサブ文字列が出現した回数の整数値を返します。
例えば:
string.count("bah") >> 0
string.count("Hello") >> 1
__contains__(self, item)
、__iter__(self)
と、__getitem__(self, key)
与えられた内のアイテムの嘘が含まれているかどうかを判断するために、そのためです。これらのメソッドの少なくとも1つを実装しin
て、カスタムタイプで使用できるようにします。