配列内の文字列が別の文字列に存在するかどうかを確認する方法はありますか。
好きです:
a = ['a', 'b', 'c']
str = "a123"
if a in str:
print "some of the strings found in str"
else:
print "no strings found in str"
そのコードはうまくいきません、それは私が達成したいことを示すためだけのものです。
any()
は、True
またはFalse
だけが必要な場合ははるかに優れたアプローチですが、どの文字列がどの文字列に一致するかを具体的に知りたい場合は、2つの方法があります。
最初の一致が欲しい場合(デフォルトはFalse
):
match = next((x for x in a if x in str), False)
あなたがすべての一致(重複を含む)を取得したい場合:
matches = [x for x in a if x in str]
すべての重複しないマッチを取得したい場合(順番を無視して):
matches = {x for x in a if x in str}
すべての重複しないマッチを正しい順序で取得したい場合は、次のようにします。
matches = []
for x in a:
if x in str and x not in matches:
matches.append(x)
a
またはstr
の文字列が長くなる場合は注意が必要です。簡単な解決策はO(S *(A ^ 2))を取ります。ここで、S
はstr
の長さで、Aはa
内のすべての文字列の長さの合計です。より速い解決策として、線形時間O(S + A)で実行される文字列照合のための Aho-Corasick アルゴリズムを見てください。
regex
を使用して多様性を追加するだけです。
import re
if any(re.findall(r'a|b|c', str, re.IGNORECASE)):
print 'possible matches thanks to regex'
else:
print 'no matches'
またはあなたのリストが長すぎる場合 - any(re.findall(r'|'.join(a), str, re.IGNORECASE))
あなたはaの要素を繰り返す必要があります。
a = ['a', 'b', 'c']
str = "a123"
found_a_string = False
for item in a:
if item in str:
found_a_string = True
if found_a_string:
print "found a match"
else:
print "no match found"
a = ['a', 'b', 'c']
str = "a123"
a_match = [True for match in a if match in str]
if True in a_match:
print "some of the strings found in str"
else:
print "no strings found in str"
jbernadasは、複雑さを減らすために、 Aho-Corasick-Algorithm について既に述べました。
これをPythonで使用する1つの方法があります。
メインのPythonファイルと同じディレクトリに置き、aho_corasick.py
という名前を付けます。
次のコードを使用して、アルゴリズムを試してください。
from aho_corasick import aho_corasick #(string, keywords)
print(aho_corasick(string, ["keyword1", "keyword2"]))
検索では大文字と小文字が区別されますことに注意してください
コンテキストに依存します(単一の単語a、e、wなど)のような単一のリテラルをチェックするかどうかは、inで十分です。
original_Word ="hackerearcth"
for 'h' in original_Word:
print("YES")
あなたがoriginal_Wordの中の文字のどれかをチェックしたいならば:を利用する
if any(your_required in yourinput for your_required in original_Word ):
そのoriginal_Wordに必要なすべての入力が必要な場合は、all simpleを使用します。
original_Word = ['h', 'a', 'c', 'k', 'e', 'r', 'e', 'a', 'r', 't', 'h']
yourinput = str(input()).lower()
if all(requested_Word in yourinput for requested_Word in original_Word):
print("yes")
私はスピードのためにこの種の関数を使うでしょう:
def check_string(string, substring_list):
for substring in substring_list:
if substring in string:
return True
return False
data = "firstName and favoriteFood"
mandatory_fields = ['firstName', 'lastName', 'age']
# for each
for field in mandatory_fields:
if field not in data:
print("Error, missing req field {0}".format(field));
# still fine, multiple if statements
if ('firstName' not in data or
'lastName' not in data or
'age' not in data):
print("Error, missing a req field");
# not very readable, list comprehension
missing_fields = [x for x in mandatory_fields if x not in data]
if (len(missing_fields)>0):
print("Error, missing fields {0}".format(", ".join(missing_fields)));
Stringですべてのリスト要素を利用可能にする方法に関するもう少し情報があります
a = ['a', 'b', 'c']
str = "a123"
list(filter(lambda x: x in str, a))
驚くほど速いアプローチはset
を使うことです:
a = ['a', 'b', 'c']
str = "a123"
if set(a) & set(str):
print("some of the strings found in str")
else:
print("no strings found in str")
これは、a
に複数文字の値が含まれていない場合に機能します(その場合は、 above のようにany
を使用します)。もしそうなら、a
を文字列として指定するほうが簡単です:a = 'abc'
。