【发布时间】:2014-03-20 20:32:56
【问题描述】:
问题是关于更快的,即。更 Pythonic,测试一个迭代中的任何元素是否存在于另一个迭代中的方法。
我想做的是这样的:
if "foo" in terms or "bar" in terms or "baz" in terms:
pass
但显然这种方式重复了“in terms”子句并使代码膨胀,尤其是当 我们正在处理更多的元素。所以我想知道在python中是否有更好的方法。
【问题讨论】:
问题是关于更快的,即。更 Pythonic,测试一个迭代中的任何元素是否存在于另一个迭代中的方法。
我想做的是这样的:
if "foo" in terms or "bar" in terms or "baz" in terms:
pass
但显然这种方式重复了“in terms”子句并使代码膨胀,尤其是当 我们正在处理更多的元素。所以我想知道在python中是否有更好的方法。
【问题讨论】:
您也可以在特殊情况下考虑是否可以使用sets 代替可迭代对象。如果(foobarbaz 和terms)都是sets,那么你可以写
if foobarbaz & terms:
pass
这并不比你的方式特别快,但它是迄今为止更小的代码,因此可能更适合阅读。
当然,并不是所有的可迭代对象都可以转换为sets,所以这取决于你的用例。
【讨论】:
想出了一个办法,在这里发布以供参考。试试这个:
if any(term in terms for term in ("foo", "bar", "baz")):
pass
【讨论】:
比 Alfe 的答案更快,因为它只测试而不是计算交叉点
if not set(terms).isdisjoint({'foo', 'bar', 'baz'}):
pass
【讨论】: