3

問題は簡単です。文字列に不正な名前が含まれている場合に true を返す関数を作成しています。

行は文字列です。

illegal_names は iterable です。

def has_illegal_item(line, illegal_names):
    illegal_items_found = False
    for item in illegal_names:
        if item in line:
            illegal_items_found = True
            break
    return illegal_items_found

したがって、これはうまく機能しますが、少し不器用で長々としたようです。これを書くためのよりきちんとした、よりpythonicな方法を誰かが提案できますか? リスト内包表記または正規表現を使用できますか?

4

3 に答える 3

6
any(name in line for name in illegal_names)
于 2012-09-04T11:04:42.367 に答える
1

次のサンプルを見てみましょう。

line = "This is my sample line with an illegal item: FOO"
illegal_names = ['FOO', 'BAR']

lineそして、不正な名前のいずれかが含まれているかどうかを調べたい場合は、広く普及しているリスト内包表記と長さチェックを使用してこれを行います。

is_correct = not bool(len([ hit for hit in illegal_names if hit in line ]))
# or
is_correct = len([ hit for hit in illegal_names if hit in line ]) == 0

非常に簡単で、短く、他のlambdaバージョンに比べて読みやすく、理解しやすい.

-コリン-

于 2012-09-04T11:20:41.473 に答える
0

私は@larsmansソリューションを使用しますが、別の方法があります。

def check_names(line, names):
    #names should be set
    parsed_line = set(line.replace(',', '').split())
    return bool(parsed_line.intersection(names))

これは、次を使用して記述することもできます。lambda

In [57]: x = lambda line, names: bool(set(line.replace(",", "").split()).intersection(names))

In [58]: x("python runs in linux", set(["python"]))
Out[58]: True

lamdba のバージョンは、可読性が過剰になる可能性があります

于 2012-09-04T11:27:59.253 に答える