Pythonic方法从字符串中的列表中查找任何项目

时间:2012-09-04 11:02:04

标签: python string list search

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

line是一个字符串。

illegal_names是可迭代的。

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的方式来写这个?我可以使用列表理解还是正则表达式?

3 个答案:

答案 0 :(得分:6)

any(name in line for name in illegal_names)

答案 1 :(得分:1)

让我们看一下以下示例:

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

并且您现在想要了解您的line是否包含非法名称之一,然后使用广泛的List Comprehension和长度检查来执行此操作:

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版本相关,易于阅读和解读。

-Colin -

答案 2 :(得分: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版本可读性过高