如果字符串不在一个或多个列表中,则引发错误。

5

如果一个列表的列表中没有出现目标字符串target_string,我希望手动引发错误。

if False in [False for lst in lst_of_lsts if target_string not in lst]:
    raise ValueError('One or more lists does not contain "%s"' % (target_string))

当然,有比上面指定的解决方案更具Python风格的解决方案。

请提供一个示例输入。 - OneCricketeer
你查找的频率有多高? - Padraic Cunningham
2个回答

9

使用all()函数

if not all(target_string in lst for lst in lst_of_lsts):
    raise ValueError('One or more lists does not contain "%s"' % (target_string))

生成器针对每个单独的测试生成TrueFalseall()检查它们是否全部为真。由于我们使用了生成器,所以评估是延迟进行的,即当第一个False被找到时停止而不会评估整个列表。
或者如果同一标签上的双重in看起来令人困惑,可以这样做
if not all((target_string in lst) for lst in lst_of_lsts):
    raise ValueError('One or more lists does not contain "%s"' % (target_string))

但是我不确定这是否真的会提高可读性。


就我个人而言,我认为你的第一个解决方案比第二个更易读。无论如何,回答非常好! - Michael Gruenstaeudl
@MichaelGruenstaeudl 让我这样重新表述一下:“但你可能会发现……更易读,但这取决于个人口味”;-) - dhke
“target_string”在if语句内未定义,因此两个表单中的第二行都会引发“NameError”。NameError: name 'target_string' is not defined - abolfazl taghribi
“target_string”是问题中查找变量的名称。在使用代码片段之前,需要设置它。 - dhke

0

你可以通过以下方式保持惰性求值并提高可读性:

for lst in lst_of_lsts :
   if target_string not in lst : 
      raise ValueError('At least one  list does not contain "%s"' % (target_string))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接