如何检查列表中的所有元素是否符合条件?

2024-12-18 08:38:00
admin
原创
72
摘要:问题描述:我有一个列表,其中包含许多子列表,每个子列表包含 3 个元素,例如:my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], ...

问题描述:

我有一个列表,其中包含许多子列表,每个子列表包含 3 个元素,例如:

my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]

每个子列表的最后一个元素是一种标志,每个子列表的初始值为 0。随着算法的进展,我想检查该标志是否至少有一个元素为 0。目前我使用 while 循环,如下所示:

def check(list_):
    for item in list_:
        if item[2] == 0:
            return True
    return False

只要满足该条件,整个算法就会循环,并在每次迭代中设置一些标志:

while check(my_list):
    for item in my_list:
        if condition:
            item[2] = 1
        else:
            do_sth()

因为在迭代列表时从列表中删除元素会导致问题,所以我使用这些标志来跟踪已经处理的元素。

我怎样才能简化或加快代码?


另请参阅检查条件是否适用于列表中任何元素的 Pythonic 方法,以检查任何元素的条件。请记住,“任何”和“所有”检查都是通过德摩根定律相互关联的,就像“或”和“和”相互关联一样。

此处的现有答案使用内置函数all进行迭代。请参阅Python 的 any 和 all 函数如何工作?all以了解及其对应项的解释any

如果您要检查的条件是“在另一个容器中找到”,请参阅如何检查以下所有项目是否都在列表中?及其对应内容如何检查以下项目之一是否在列表中?使用anyall可以工作,但可能存在更有效的解决方案。


解决方案 1:

这里最好的答案是使用all(),这是这种情况的内置函数。我们将其与生成器表达式结合使用,以干净高效地产生您想要的结果。例如:

>>> items = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
>>> all(flag == 0 for (_, _, flag) in items)
True
>>> items = [[1, 2, 0], [1, 2, 1], [1, 2, 0]]
>>> all(flag == 0 for (_, _, flag) in items)
False

请注意,all(flag == 0 for (_, _, flag) in items)直接等同于all(item[2] == 0 for item in items),只是在这种情况下读起来更舒服一些。

对于过滤器示例,有一个列表推导(当然,您可以在适当的地方使用生成器表达式):

>>> [x for x in items if x[2] == 0]
[[1, 2, 0], [1, 2, 0]]

如果您想检查至少一个元素是否为 0,那么更好的选择是使用any()更易读的方法:

>>> any(flag == 0 for (_, _, flag) in items)
True

解决方案 2:

如果您想检查列表中的任何项目是否违反条件,请使用all

if all([x[2] == 0 for x in lista]):
    # Will run if all elements in the list has x[2] = 0 (use not to invert if necessary)

要删除所有不匹配的元素,使用filter

# Will remove all elements where x[2] is 0
listb = filter(lambda x: x[2] != 0, listb)

解决方案 3:

您可以像这样使用 itertools 的 takewhile,一旦满足导致您的语句失败的条件,它就会停止。相反的方法是 dropwhile

for x in itertools.takewhile(lambda x: x[2] == 0, list)
    print x

解决方案 4:

这种方式比使用以下方式更灵活all()

my_list = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
all_zeros = False if False in [x[2] == 0 for x in my_list] else True
any_zeros = True if True in [x[2] == 0 for x in my_list] else False

或者更简洁地说:

all_zeros = not False in [x[2] == 0 for x in my_list]
any_zeros = 0 in [x[2] for x in my_list]

解决方案 5:

另一种使用方法itertools.ifilter。这将检查真实性和过程(使用lambda

样本-

for x in itertools.ifilter(lambda x: x[2] == 0, my_list):
    print x
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   984  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   0  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   0  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   0  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用