如何检查列表中的所有元素是否符合条件?
- 2024-12-18 08:38:00
- admin 原创
- 71
问题描述:
我有一个列表,其中包含许多子列表,每个子列表包含 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
。
如果您要检查的条件是“在另一个容器中找到”,请参阅如何检查以下所有项目是否都在列表中?及其对应内容如何检查以下项目之一是否在列表中?使用any
和all
可以工作,但可能存在更有效的解决方案。
解决方案 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
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件