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

2024-12-18 08:38:00
admin
原创
158
摘要:问题描述:我有一个列表,其中包含许多子列表,每个子列表包含 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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2560  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1552  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   1  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   2  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   3  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用