通过迭代测试列表中多个值的成员资格
测试列表中多个值的成员资格时,Python 的行为可能会令人困惑。在['b', 'a', 'foo', 'bar']中使用'a','b'返回('a', True),表示结果是一个元组,其中第一个元素是第一个值检查,第二个元素是该值的成员资格。要测试列表中多个值的成员资格,建议使用以下方法:
all(x in ['b', 'a', 'foo', 'bar'] for x in ['a', 'b'])
此语句使用 all() 函数中的生成器表达式来测试第二个列表中的每个值的成员资格第一个。
替代方法
虽然基于迭代的方法通常是可靠的,但也存在替代方法。使用集合提供了子集测试选项:
set(['a', 'b']).issubset(set(['a', 'b', 'foo', 'bar']))
但是,集合只能包含可哈希元素,限制了它们的应用。
速度注意事项
子集测试通常更快,但只有当容器和项目都很小时,差异才显着。在大多数情况下,使用 all() 函数仍然有效。
如果项目已经在列表中,在使用子集测试之前将它们转换为集合可以提供轻微的加速。不建议将非集合的容器转换为集合,因为加速效果很小,而且额外的存储开销可能会产生问题。
例外情况
何时测试大量值的成员资格,特别是如果某些值不在容器中,all() 可以比子集测试提供显着的速度优势。这是由于其短路行为,使其能够绕过容器中不存在的测试元素。
摘要
对于一般用途,将如果集合的元素是可散列的,则建议将其容器化。仅当测试项已存储在集合中时,子集测试才有优势。在某些情况下,例如测试大量值的成员资格,all() 可以提供卓越的性能。
以上是如何有效测试 Python 列表中多个值的成员资格:迭代、集合或 all()?的详细内容。更多信息请关注PHP中文网其他相关文章!