问题很简单。我正在编写一个函数,如果该字符串包含任何非法名称,则返回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的方式来写这个?我可以使用列表理解还是正则表达式?
答案 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版本可读性过高