2016-07-27 5 views
1

私はこの初心者であることを謝罪します。Python; IF word in lineとword2が行にない

私は、特定の言葉を見つけ出して2番目の単語と一致するコードを書こうとしています2番目の単語が同じ行にあるかどうかを調べるための単語のリスト。 最初の単語が両方の行に存在しない場合にのみ、行を印刷します。ここ

keywords =("a","b","c","d") 
keywords2 = ("e","f","g") 
a = ("a is a ", "a is not e","b is b", "b is not f") 
for key2 in keywords2:    
    for key in keywords:     

     for line in a: 

       if key2 not in line: 
        if key in line: 

         print(key+" Found in --> ") 
         print  (line) 

スニペットと例では、我々は

a Found in --> 
a is a 
b Found in --> 
b is b 
b Found in --> 
b is not f 
a Found in --> 
a is a 
a Found in --> 
a is not e 
b Found in --> 
b is b 
a Found in --> 
a is a 
a Found in --> 
a is not e 
b Found in --> 
b is b 
b Found in --> 
b is not f 

を持っていながら、私はループを実装するためのいくつかの方法を試してみましたが、役に立たない

答えて

1

@joonはご質問のスタイルで回答します。

ループ以上最初に、コードは "この行を印刷する必要がありますか?"のように動作するはずです。各行について。

keywords = ("a","b","c","d") 
keywords2 = ("e","f","g") 

a = ("a is a ", "a is not e", "b is b", "b is not f") 

for line in a: 
    for k in keywords: 
     if k in line: 
      for k2 in keywords2: 
       if k2 in line: 
        break 
      else: 
       print(line) 

オンライン試してみてください:/他の場合https://repl.it/CgW8

はPythonの考えですが、それは少し奇妙だ - ループが正常に終了した場合、else:はラインを実行して印刷します。ループが途切れると、else:は実行されず、行が印刷されません。

しかし、多くの慣用的な答えは、リストに何かがTrueの場合はTrueを返しany()を利用することになり、そうでなければFalse:

keywords =("a","b","c","d") 
keywords2 = ("e","f","g") 
a = ("a is a ", "a is not e","b is b", "b is not f") 

for line in a: 
    if any(k in line for k in keywords): 
     if not any(k2 in line for k2 in keywords2): 
      print(line) 

オンライン試してみてください。https://repl.it/CgW9

0
する必要があり、必要な出力が

a is a 
b is b 

です

これはあなたのために機能しますか?

keywords =("a","b","c","d") 
keywords2 = ("e","f","g") 
lines = ("a is a ", "a is not e","b is b", "b is not f") 

for keyword in keywords: 
    for line in lines: 
     if keyword in line: 
      keyword2_exist = False 
      for keyword2 in keywords2: 
       if keyword2 in line: 
        keyword2_exist = True 

      if not keyword2_exist: 
       print(line) 
2

私が正しく理解していれば「keywords」の値を持つ「線」だけを使用しますが、keywords2は使用しません。その場合には、単純に実行します。

for line in a: 
    if [x for x in keywords if x in line] and not [x for x in keywords2 if x in line]: 
     print line 

keywords内のすべての項目をループし、彼らはlineである場合は、リストに追加します[x for x in keywords if x in line]

[x for x in keywords2 if x in line]keywords2のすべての項目をループし、lineにある場合はリストに追加します。

空リストはFalseとみなされ、keywordsリストは空ではなく、keywords2リストは空にします。これはおそらく、あなたのためのより良い仕事ができる

+2

は、'いずれかを() 'を使用する方が効率的かもしれません値。だから、 'any(キーワードのキーワードはキーワードに並んでいます)'を使います。 –

+0

@Andrew Guy - 注目され、良い点。 'any'を使ってリストの長さを決めることができるのであれば、より意味をなさないでしょう...しかし、あなたはbooleanとNoneの値も調べなければならないと思います。 – lps

0

import re 

keywords =("a","b","c","d") 
keywords2 = ("e","f","g") 

pattern = re.compile(r'^(\w+)\s+is\s+(?:not\s+)?(\w+)') 
for line in ("a is a", "a is not e","b is b", "b is not f"): 
    for key1, key2 in pattern.findall(line): 
     if key1 in keywords and key2 not in keywords2: 
      print (line) 

私が理解から、2つのキーワードが文字列です。それぞれがkey is [not] key2の形式であり、keykeywordsで、key2にある行だけがkeywords2にない場合は、印刷することを検討しています。それは本質的に上記の溶液を

0

を何あなたは、いくつかの関数型プログラミングを学ぶ必要があり、これを試してみてください。これは最初の `true`を上戻りますよう

keywords =("a","b","c","d") 
keywords2 = ("e","f","g") 
a = ("a is a ", "a is not e","b is b", "b is not f") 

for line in a: 
    if not any(map(lambda x: x in line, keywords2)): 
     if any(map(lambda x: x in line, keywords)): 
      print line