专栏文章 关于 Python 中 any() 函数和列表推导式的一些深入理解

大海 · 2024年02月01日 · 最后由 大海 回复于 2024年02月02日 · 5268 次阅读

背景

关于这段代码,有没有更优雅的写法?

if 'IOTregist' in result.keys() or 'lift' in result.keys() or 'loginName' in result.keys() or 'beginTime' in result.keys():
     continue 

分析

在 Python 中,如果你想要检查字典result是否包含一组特定的键,并在存在这些键中的任意一个时跳过当前迭代或继续执行下一次循环,可以使用集合(set)来简化这个条件表达式。以下是一个更简洁、可读性更强的实现方式:

if any(key in result.keys() for key in {'IOTregist', 'lift', 'loginName', 'beginTime'}):
    continue

这里,any()函数会检查给定生成器表达式的结果,该表达式依次测试每个指定的键是否存在于字典的键集中。只要有一个键存在于字典中,any()函数就会返回True,进而执行continue语句。

这种写法的好处是显而易见的:它更容易扩展和维护,尤其是当你需要添加更多关键词进行检查时。同时,集合查找的时间复杂度为 O(1),所以这种方法在处理大量关键词时效率更高。

对比这样的写法,有啥不同?

if any(key in ['IOTregist', 'lift', 'loginName', 'beginTime'] for key in result.keys()):
    continue

这个写法在逻辑上与之前提到的优雅写法有所不同。在这个表达式中,any()函数接收的是一个生成器表达式,该表达式遍历字典result的所有键,并对每个键检查它是否包含于列表['IOTregist', 'lift', 'loginName', 'beginTime']中。

这种写法的问题在于,它实际上是检查了字典中的每一个键是否存在于给定列表中,而不是直接检查字典本身是否包含这些特定的键。这意味着即使字典中有一个不相关的键(不在列表内),也会进行比较。

总结

对于较小的数据规模(如您提供的几个键的情况),使用列表或集合在any()函数内部进行成员资格测试,性能差异通常并不显著。但如果要对比在大规模数据下哪种方式更高效:

  • 集合(set):在 Python 中,集合的成员查找操作具有 O(1) 的时间复杂度,这意味着无论集合有多大,查找一个元素所需的时间基本是恒定的。

  • 列表(list):列表的成员查找操作平均时间复杂度为 O(n),即如果列表很大,查找特定元素可能需要遍历整个列表。

因此,在处理大量数据时,如果关注效率和性能优化,使用集合会更加高效。但是,对于只有少量固定键值需要检查的情况,使用列表也不会造成明显的性能瓶颈。在您的代码片段中,因为涉及的键数量很少,所以选择列表还是集合对整体程序执行效率影响不大。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞

any(key in result.keys() for key in {'IOTregist', 'lift', 'loginName', 'beginTime'})

any(key in ['IOTregist', 'lift', 'loginName', 'beginTime'] for key in result.keys())
哪个好?后面看懵了

:d 都集合了, 不求个交集再走?
targetset = {'IOTregist', 'lift', 'loginName', 'beginTime'}
if len( targetset.intersection( set( result.keys() ) ):
continue

yeyu #1 回复

这种效率高:any(key in result.keys() for key in {'IOTregist', 'lift', 'loginName', 'beginTime'})

one.way #2 回复

对于较小的数据规模(如您提供的几个键的情况),使用列表或集合在any()函数内部进行成员资格测试,性能差异通常并不显著。但如果要对比在大规模数据下哪种方式更高效:

  • 集合(set):在 Python 中,集合的成员查找操作具有 O(1) 的时间复杂度,这意味着无论集合有多大,查找一个元素所需的时间基本是恒定的。

  • 列表(list):列表的成员查找操作平均时间复杂度为 O(n),即如果列表很大,查找特定元素可能需要遍历整个列表。

因此,在处理大量数据时,如果关注效率和性能优化,使用集合会更加高效。但是,对于只有少量固定键值需要检查的情况,使用列表也不会造成明显的性能瓶颈。在您的代码片段中,因为涉及的键数量很少,所以选择列表还是集合对整体程序执行效率影响不大。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册