3

问题很简单。我正在编写一个函数,如果字符串包含任何非法名称,则返回 true。

线是一个字符串。

非法名称是一个可迭代的。

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 回答