如何检查列表的所有元素是否符合条件? [英] How to check if all elements of a list match a condition?
问题描述
我有一个包含 20000 个列表的列表.我使用每个列表的第三个元素作为标志.我想对这个列表做一些操作,只要至少有一个元素的标志为0,就像:
my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]
一开始,所有标志都是0.我使用while循环来检查是否至少有一个元素的标志是0:
def check(list_):对于 list_ 中的项目:如果项目[2] == 0:返回真返回错误
如果 check(my_list)
返回 True
,那么我会继续处理我的列表:
while check(my_list):对于 my_list 中的项目:如果条件:项目[2] = 1别的:do_sth()
实际上,我想在迭代时删除 my_list 中的元素,但是在迭代时不允许删除项目.
原来的 my_list 没有标志:
my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]
因为我在迭代时无法删除元素,所以我发明了这些标志.但是 my_list
包含很多项,并且 while
循环在每个 for
循环中读取所有这些项,并且消耗大量时间!你有什么建议吗?
这里最好的答案是使用 all()
,这是针对这种情况的内置函数.我们将其与生成器表达式结合起来,以干净、高效的方式生成您想要的结果.例如:
注意 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()
更具可读性:
I have a list consisting of like 20000 lists. I use each list's 3rd element as a flag. I want to do some operations on this list as long as at least one element's flag is 0, it's like:
my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]
In the beginning, all flags are 0. I use a while loop to check if at least one element's flag is 0:
def check(list_):
for item in list_:
if item[2] == 0:
return True
return False
If check(my_list)
returns True
, then I continue working on my list:
while check(my_list):
for item in my_list:
if condition:
item[2] = 1
else:
do_sth()
Actually, I wanted to remove an element in my_list as I iterated over it, but I'm not allowed to remove items as I iterate over it.
Original my_list didn't have flags:
my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]
Since I couldn't remove elements as I iterated over it, I invented these flags. But the my_list
contains many items, and while
loop reads all of them at each for
loop, and it consumes lots of time! Do you have any suggestions?
The best answer here is to use all()
, which is the builtin for this situation. We combine this with a generator expression to produce the result you want cleanly and efficiently. For example:
>>> 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
Note that all(flag == 0 for (_, _, flag) in items)
is directly equivalent to all(item[2] == 0 for item in items)
, it's just a little nicer to read in this case.
And, for the filter example, a list comprehension (of course, you could use a generator expression where appropriate):
>>> [x for x in items if x[2] == 0]
[[1, 2, 0], [1, 2, 0]]
If you want to check at least one element is 0, the better option is to use any()
which is more readable:
>>> any(flag == 0 for (_, _, flag) in items)
True
这篇关于如何检查列表的所有元素是否符合条件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!