-1

par_listこれより前のコードで開始されます。私がテストしているセクションでは、表示され"calendar"ません。では、なぜ if ステートメントを として評価するのTrueでしょうか?

while cake:
    print "Length of par_list = ", len(par_lst)

    for rows in par_lst:
        if "calendar" or "Calendar" in rows:
            print "you shouldn't be here"
            writer.writerow(rows)
4

3 に答える 3

11

これは、コードが次のようになるためです。

if "calendar" in rows or "Calendar" in rows:

Python では、空でない文字列は常に に評価されTrueます。さらに、現在のコードは基本的にこれと同じです:

if ("calendar") or ("Calendar" in rows):

これは、この条件が常に返さTrueれることを意味し"calendar"ますTrue。実際、その部分に到達することさえありません("Calendar" in rows)

デモンストレーションとして、次のことを考慮してください。

>>> bool("calendar" or "Calendar" in rows)
True
>>>

を定義していなくてもrows、 を取得できないことに注意してNameErrorください。代わりに、コードは を返しますTrue"Calendar" in rowsそれは、上で述べたように、その部分に到達することさえないからです。実際、これが行うのは"calendar"、空でない文字列である を評価することだけTrueです。

于 2013-09-27T15:47:44.220 に答える
3
if "calendar" or "Calendar" in rows:

これは常に真実です。"calendar"長さがゼロでない文字列である場合、これは true であり、or'd with"Calendar" in rowsは常に true です。実際、が true である"Calendar" in rowsため、 が評価されることさえありません"calendar"

あなたがしたい:

if "calendar" in rows or "Calendar" in rows:

これは、実際にはrows2 回検索するため、最も効率的ではありません。一度だけ検索するには、次を試してください。

if (row.lower() = "calendar" for row in rows):

ただし、これは実際には行を 2 回検索するよりも高速ではない可能性があります。1 つ目は明示的なループであるため、2 つ目はテスト前に各行を小文字にするためです。「calendar」や「Calendar」だけでなく、「CALENDAR」や「CALenDAR」など、あらゆるケースに一致するという利点があります。

さて、これはまだあなたが望むものではないかもしれないと感じています. 行の 1 つが正確​​に文字列でない限り"calendar"(いずれにせよ)、これは常に false になります。たとえば、ファイルからリストを読み取った場合、行末が含まれている可能性があり、このテストが一致しなくなります。または、文字列に他のテキストが含まれている可能性があり、各行その単語が含まれているかどうかをテストしたいだけです。この場合、次のように記述します。

if any("calendar" in row.lower() for row in rows):
于 2013-09-27T15:50:09.560 に答える
1
if "calendar" or "Calendar" in rows:

と同等です

if "calendar" or ("Calendar" in rows):

"calendar"は真なので、条件は合格です。

于 2013-09-27T15:48:09.987 に答える