2016-07-02 7 views
-3

x in yを使ってチェックすると2つの文字列があるとわかります。そして、文字列がリスト内のいずれかの文字列に含まれているかどうかをチェックしたいのであれば、そのためにループを使用するだけです。あるリスト内の文字列が別のリストの部分文字列であるかどうかを調べる

しかし、最初のリストのいずれかの文字列が2番目のリストの文字列の部分文字列であるかどうかを確認する最も非効率的で効率的な方法は何ですか?

例は次のようになります。

notPresent = [] 
present = [] 
listA = ['Rick', 'James'] 
listB = ['Rick', 'Ricky', 'Ryan', 'Jam', 'Jamesses', 'Jamboree'] 

notPresent = ['Ryan', 'Jam', 'Jamboree'] 
present = ['Rick', 'Ricky', 'Jamesses'] 

私は両方presentnotPresent単語を使用するつもりです。ループの

#python2 
notPresent = set() 
present = set() 
listA = ['Rick', 'James'] 
listB = ['Rick', 'Ricky', 'Ryan', 'Jam', 'Jamesses', 'Jamboree'] 

#notPresent = ['Ryan','Jam','Jamboree'] 
#present = ['Rick','Ricky','Jamesses'] 

for b in listB: 
    for a in listA: 
    if a in b: 
     present.add(b) 
     break 
    else: 
    notPresent.add(b) 

print(list(notPresent)) 
print(list(present)) 

だから、基本的には2:

+0

* "* - [' any'](https://docs.python.org/3/library/functions.html#any)のいずれかがチェックされていますか?あなたは、現在のコードが妥当ではないと思いますか? – jonrsharpe

+0

「リストの要素のいずれか」と同様。私は、既存のコードを最適化するのではなく、これを行う方法を理解する過程にあります。私はforループ内のforループを推測しています。 – McLeodx

+0

はい、私は理解しています、そして、私は*そのための組み込み関数があると言っています。リンクをたどって見てください! – jonrsharpe

答えて

0

私はこのような何かを言うでしょう。そして、使用はあなたがanyset理解でこれを行うことができます...リスト(値のFRの一意性)の代わりに

+0

*なぜ*あなたはそのようなことを言っていますか?いくつかの説明を追加できますか? 1つの明らかな問題は、項目がマッチした後でも 'listA'をスキャンし続けることです。 – jonrsharpe

+0

マッチング後にスキャンを修正しました。私はこのようにする理由は、問題の明確で読みやすいアプクラッシュである(別のリストの項目でリストをスキャンすると、2つのループのように見える)。 scannin listAの後にlistBのすべての要素に対して何かしたいと思えば、listBのforループを外側のリングに置くことがわかりました。 セットは値が1つしか格納されておらず、要素を1回だけ必要とするため、より明確に見えます。しかし、休憩では、リストも同様に機能します(私はおしゃれです)。 –

+0

1.答え*に説明を入れてください。これは最小限の修正です。 'for:else:'の構文は、あなたが現在持っている(やや平凡ではない)フラグを削除することに注意してください。 – jonrsharpe

1

を設定します。

listA = ['Rick', 'James'] 
listB = ['Rick', 'Ricky', 'Ryan', 'Jam', 'Jamesses', 'Jamboree'] 

present = {i for i in listB if any(j in i for j in listA)} 
notPresent = set(listB) - present # difference of two sets 

print(present) 
# {'Rick', 'Ricky', 'Jamesses'} 

print(notPresent) 
# {'Jamboree', 'Ryan', 'Jam'} 

anyは試合後、反復の全体の長さを実行している回避することができますが見つかりました。setを使用すると、最初から相補的なセットnotPresentを生成することができます。

1

最速の方法は、listBで各文字列のため、

setA = set(listA) 

その後、セットに最初のリストを回すそのストリングのいずれかがsetAであるかどうかを確認するためと考えられます。

def substrings(s): 
    for i in range len(s) 
     for j in range i 
      yield s[i:j] 

result = [] 
for s in listB: 
    if any(substring in setA for substring in substrings(s)): 
     result.append(s) 
+0

文字列を最初に小文字にすることを覚えておいてください。 –

+0

"サフィックス配列のデータ構造" –

関連する問題