2

ファイルを 1 行ずつ読み込んでいて、必要に応じて line.split(',') で区切りました。ここで、フラグを立てたり、リストにコピーしたり、次の機能を実行したりします。

文字列「THIS」を含み、「THAT」を含まない行。

私は次のようなものを撮影しています:

if any(('THIS' in s for s in csvLine) if any('THAT' **!in** s for s in csvLine):
        print csvLine

しかし、これはまったく良い構文ではありません。私はリスト内包表記を使用して頭を悩ませていると思いますが、この回答のおかげで以前に成功しました。

私は以下のコードで実用的な解決策を持っていますが、もっと良いものがあると感じています:

    if any('THAT' in s for s in csvLine):
        print "do nothing"
    elif any('THIS' in s for s in csvLine):
        print "do something"
    else:
        print "do nothing"

これらの if-else ステートメントのロジックを、より美しい Pythonic コードに圧縮するにはどうすればよいですか?

これは私の実際の、一般化されていない平易な英語の質問です。行に CHAT と TRANSFER が含まれている場合、それは重要ではありません。CHAT のみが含まれている場合は、重要ではありません。CHAT という単語ではなく TRANSFER だけが含まれている場合は注目に値するので、この行を何とかしたいと思います。TRANSFER という単語が含まれているが、CHAT が含まれていない行を見つけるにはどうすればよいですか?

4

3 に答える 3

4

私が完全に理解しているかどうかわからない-なぜあなたはラインを繰り返す必要があるのですか?これはうまくいくようです:

if 'this' in csvLine and not 'that' in csvLine:
    do_something()
于 2012-06-11T19:00:39.943 に答える
1
if any('THIS' in s for s in csvLine) and all('THAT' not in s for s in csvLine):

と同じです

if any('THIS' in s for s in csvLine) and not any('THAT' in s for s in csvLine):

「THIS」の部分は「THIS」が見つかるとすぐに反復を停止し、「THAT」は「THAT」が見つかるとすぐに反復を停止します。反復の一方または両方を完了する必要がある可能性があります。

于 2012-06-11T18:59:29.193 に答える
1

リンク先の質問から、わずかな変更を加えます。

csv_line = ["Has CHAT", "Has TRANSFER", "Has CHAT and TRANSFER"]
transfers = [s for s in csv_line if "TRANSFER" in s and "CHAT" not in s]
print transfers

>>> ['Has TRANSFER']
于 2012-06-11T19:02:23.233 に答える